Linq查找并消除重复的文件名

时间:2013-08-03 12:51:41

标签: c# linq visual-studio-2008

您好我正在使用linq消除重复文件名...

这些是要收集FileData的条件。但是如何仅通过比较f.Name属性的FileName来获得Distinct值。

我试过

IEnumerable<FileData> files = FastDirectoryEnumerator
                    .EnumerateFiles(myDirectory.FullName, "*.zip", 
                     SearchOption.AllDirectories)
                    .Where(f => f.Size / 1024 > 750)
                    .Where(f => !f.Name.EndsWith(".reg.zip"))
                    .Where(f => f.Name.StartsWith("2001"));

从此可以获取唯一文件名.. ??

1 个答案:

答案 0 :(得分:1)

使用GroupBy方法:

IEnumerable<FileData> dats = FastDirectoryEnumerator
    .EnumerateFiles(myDirectory.FullName, "*.zip", SearchOption.AllDirectories)
    .Where(f => f.Size / 1024 > 750)
    .Where(f => !f.Name.EndsWith(".reg.zip"))
    .Where(f => f.Name.StartsWith("2001"))
    .GroupBy(f => f.Name)
    .Select(g => g.First());

或者在查询语法中:

IEnumerable<FileData> dats = 
    from f in FastDirectoryEnumerator.EnumerateFiles(…)
    where f.Size / 1024 > 750 &&
          !f.Name.EndsWith(".reg.zip") &&
          f.Name.StartsWith("2001") &&
    group f by f.Name into g
    select g.First();

这将返回每个名称的第一个FileData。如果您只想获得唯一的Name值,则实际上更容易:

IEnumerable<string> dats = FastDirectoryEnumerator
    .EnumerateFiles(myDirectory.FullName, "*.zip", SearchOption.AllDirectories)
    .Where(f => f.Size / 1024 > 750)
    .Where(f => !f.Name.EndsWith(".reg.zip"))
    .Where(f => f.Name.StartsWith("2001"))
    .Select(f => f.Name)
    .Distinct();

或者在查询语法中:

IEnumerable<string> dats = 
    (from f in FastDirectoryEnumerator.EnumerateFiles(…)
     where f.Size / 1024 > 750 &&
           !f.Name.EndsWith(".reg.zip") &&
           f.Name.StartsWith("2001") &&
     select f.Name)
    .Distinct();