[英]Removing duplicates from fileinfo list
我正在从fileinfo列表中填充一个组合框-但是当我在索引的开头添加-请选择-时,它会给我重复项:
string[] filters = new[] { "*.html", "*.htm" };
string[] gettemplates = filters.SelectMany(f => Directory.GetFiles(emailTemplatesFolder, f)).ToArray();
List<System.IO.FileInfo> templates = new List<System.IO.FileInfo>();
FileInfo fi = new FileInfo("---Please Select---");
templates.Insert(0, fi);
foreach (string file in gettemplates)
{
System.IO.FileInfo t = new System.IO.FileInfo(file);
templates.Add(t);
}
BindingSource bs = new BindingSource();
bs.DataSource = templates;
comboEmailTemplates.DisplayMember = "Name";
comboEmailTemplates.ValueMember = "Filepath";
comboEmailTemplates.DataSource = bs;
试过
List System.IO.FileInfo unique = templates.Distinct().ToList();
并绑定到新来源,但仍然带来重复项。
我究竟做错了什么?
谢谢
仁
使用Distinct
它将使用所讨论类型的默认比较器。 在您的情况下,它是FileInfo
,不会覆盖Object
的默认值。 因此,比较仅供参考。 由于列表中的每个项目都是不同的实例(使用new
关键字),因此它们是不同的。
快速解决方案-将字符串作为不同的集合:
filters.SelectMany(f => Directory.GetFiles(emailTemplatesFolder, f)).Distinct().ToArray();
总之,我会重构一下:
var templates = new List<FileInfo>();
templates.Insert(0, new FileInfo("---Please Select---"););
templates.AddRange(filters.SelectMany(f => Directory.GetFiles(emailTemplatesFolder, f))
.Distinct()
.Select(f => new FileInfo(f)));
BindingSource bs = new BindingSource();
bs.DataSource = templates;
问题在于列表中的所有元素都是不同的对象,并且Distinct()LINQ方法将在引用时对其进行比较。 解决方案是实现IEqualityComparer并使用Distinct()方法的重写。 例如,如果您想按名称进行比较。
public class FileNameComparer : IEqualityComparer<FileInfo>
{
public bool Equals(FileInfo x, FileInfo y)
{
if (x == y)
{
return true;
}
if (x == null || y == null)
{
return false;
}
return string.Equals(x.Name, y.Name, StringComparison.OrdinalIgnoreCase);
}
public int GetHashCode (FileInfo obj)
{
return obj.Name.GetHashCode ();
}
}
然后像这样使用它
List System.IO.FileInfo unique = templates.Distinct(new FileNameComparer()).ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.