gpt4 book ai didi

c# - 防止重复的 List 条目

转载 作者:可可西里 更新时间:2023-11-01 08:36:09 24 4
gpt4 key购买 nike

我希望我能够解决这个问题,但我终其一生都无法理解为什么这段代码无法正常运行并允许将重复的条目添加到列表中。

永远不会满足 if 语句条件,即使我从同一位置拖入相同的文件也是如此。我不明白为什么“包含”方法不匹配它们。

public class Form1:Form {
private List<FileInfo> dragDropFiles = new List<FileInfo>();

private void Form1_DragDrop(object sender, DragEventArgs e) {
try {
if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
string[] files =
(string[])e.Data.GetData(DataFormats.FileDrop);

OutputDragDrop(files);
}
}
catch { }
}

private void Form1_DragEnter(object sender, DragEventArgs e) {
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.Copy;
else
e.Effect = DragDropEffects.None;
}

private void OutputDragDrop(string[] files) {
try {
foreach (string file in files) {
FileInfo fileInfo = new FileInfo(file);

if (dragDropFiles.Contains(fileInfo)) {
dragDropFiles.Remove(fileInfo);
}
dragDropFiles.Add(fileInfo);
}
PopulateContextMenu();
}
catch { }
}
}

我以为我找到了另一种使用“Distinct”实现此目的的方法

但是,checkedDragDropFilesdragDropFiles 似乎具有相同数量的条目,包括重复项,除非 dragDropFiles 显示在 ListBox 它不显示它们。为什么要这样做?

我需要防止任何重复的列表条目,因为我会根据列表数据以编程方式创建菜单。

private void OutputDragDrop(string[] files)
{
try
{
foreach (string file in files)
{
FileInfo fileInfo = new FileInfo(file);

//if (dragDropFiles.Contains(fileInfo))
//{
// dragDropFiles.Remove(fileInfo);
//}
dragDropFiles.Add(fileInfo);
}

List<FileInfo> checkedDragDropFiles = dragDropFiles.Distinct().ToList();

debugList.DataSource = checkedDragDropFiles;
debugList2.DataSource = dragDropFiles;
//PopulateContextMenu();
}
catch { }
}

最佳答案

List<T>确实允许重复。

FileInfo的情况下, Contains方法将检查引用是否相同,但是当您获取一组完全新的 FileInfo 时, 引用不同。

您需要使用 Contains 的重载这需要 IEqualityComparer - 参见 here .

您还可以使用 HashSet<T> 相反 - 它是一种不允许重复的数据结构(尽管使用不同的引用,你仍然会遇到这个问题)。

关于c# - 防止重复的 List<T> 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8819058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com