【发布时间】:2012-02-07 19:06:44
【问题描述】:
我希望我能够解决问题,但我一生都无法理解为什么此代码无法正常运行并允许将重复条目添加到列表中。
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”实现此目的的方法
但是,checkedDragDropFiles 和 dragDropFiles 似乎具有相同数量的条目,包括重复项,除非 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 { }
}
【问题讨论】:
-
是什么让
FileInfos 相同,也许你应该实现一个IEqualityComparer<FileInfo>来传递给Distinct -
请注意:如果
Contains返回true,为什么要删除和添加?进行否定检查,仅在列表不不包含该值时添加。 -
Oded:说得好,这有点浪费。
标签: c# list collections duplicates