1

嗨,我正在使用 linq 来消除重复的文件名...

这些是FileData要收集的条件。但是如何仅通过比较其 FileName 即f.NameProperty 来获取 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"));

从这里我可以得到唯一的文件名..??

4

1 回答 1

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();
于 2013-08-03T12:53:58.790 回答