2011-09-07 124 views
6

这不是一个复杂的问题,但我不能用linq包裹我的头。联合列表使用Linq列表

我有包含Enumerable<T>Enumerable<string>

public class 
{ 
    List<List<string>> ListOfLists = new List<List<string>>(); 
} 

我基本上要返回从ListOfLists每个唯一的字符串;这是很容易使用foreach循环和存储变量(我可能改善没有在最后的明显的效率,但是这不是重点):

List<string> result = new List<string>(); 

foreach (var v in ListOfLists) 
{ 
    foreach (var s in v) 
    { 
     result.Add(s); 
    } 
} 

result.Distinct(); 

如何做到这一点的LINQ?

+0

您已经有答案。我会建议在这个问题上使用Extension方法!您的扩展方法以优化的方式执行SelectMany和Distinct。 –

回答

8
var distinctStrings = ListOfLists.SelectMany(list => list).Distinct(); 
1
var result = ListOfLists.SelectMany(v => v).ToList().Distinct(); 

编辑:为了更好的性能,用途:

var result = ListOfLists.SelectMany(v => v).Distinct(); 

var result = ListOfLists.SelectMany(v => v).Distinct().ToList(); 
+0

没有必要在中间的那个ToList – RichK

+0

如果你确实需要ToList,在Distinct之后而不是之前做。在这种情况下,您的Distinct现在返回IEnumerable ,这可能不是您想要的。另外,在整个列表上执行ToList时会有一个内存/ perf命中,然后将结果限制为Distinct,而不是先执行Distinct。 –

+0

@Jim Wooley - 伟大的建议。感谢你和RichK的反馈意见。我们已经学习了。 – Leons

5

为了完整起见,查询表达式语法是有时容易(我发现)至拿出比正确的调用SelectMany。这将是:

result = (from list in ListOfLists 
      from s in list 
      select s).Distinct().ToList(); 
+0

对于SelectMany上的查询语法+1 –