从fileinfo列表

时间:2018-04-08 13:00:12

标签: c# list combobox

我正在从一个文件信息列表中填充一个组合框 - 但是当我在索引的开头添加--Please Select--时,它会给我重复:

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();

并绑定到新源但它仍然带来重复。

我做错了什么?

由于

2 个答案:

答案 0 :(得分:0)

使用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;

答案 1 :(得分:0)

问题是列表中的所有元素都是不同的对象,而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();