Linq IEnumerable <igrouping <string,class =“”>&gt;返回List <class> </class> </iggrouping <string,>

时间:2014-01-09 02:09:47

标签: c# linq

如何将以下声明更改回List<DocumentData>

IEnumerable<IGrouping<string, DocumentData>> documents = 
                 documentCollection.Select(d => d).GroupBy(g => g.FileName);

目标是获得应该小于documentCollection的List。 FileName包含重复项,因此我想确保我没有重复的名称。

我也尝试了以下内容,但它仍然向我提供了重复的文件名

documentCollection = 
    documentCollection.GroupBy(g => g.FileName).SelectMany(d => d).ToList();

2 个答案:

答案 0 :(得分:10)

每个IGrouping<string, DocumentData>都是IEnumerable<DocumentData>,因此您只需调用SelectMany即可展平序列:

var list = documents.SelectMany(d => d).ToList();

编辑:根据更新后的问题,OP似乎只想为任何给定文件名选择第一个文档。这可以通过在每个First()实例上调用IGrouping<string, DocumentData>来实现:

IEnumerable<DocumentData> documents = 
    documentCollection.GroupBy(g => g.FileName, StringComparer.OrdinalIgnoreCase)
                      .Select(g => g.First())
                      .ToList();

答案 1 :(得分:3)

你还没有说T你要找的List<T>应该代表什么,所以这里有几个最有可能成为的人:

  1. List<DocumentData> - 相当无意义,因为您已经在documentCollection

    var results = documents.SelectMany(g => g).ToList();
    
  2. List<KeyValuePair<string, List<DocumentData>>

    var results =
           documents.Select(g => new KeyValuePair(g.Key, g.ToList())).ToList();
    
  3. List<string> - 只是名称

    var results = documents.Select(g => g.Key).ToList();
    
  4. List<IGrouping<string, DocumentData>>

    var results = documents.ToList();