C# 在C语言中并集多个列表#

C# 在C语言中并集多个列表#,c#,linq,list,extension-methods,C#,Linq,List,Extension Methods,我正在为以下情况寻找一个优雅的解决方案: 我有一个包含如下列表的类 class MyClass{ ... public List<SomeOtherClass> SomeOtherClassList {get; set;} ... } 注意:b.SomeotherClasses属性返回一个列表 这段代码还远远不够完美,一些问题是因为我必须弄清楚什么是使用C#3的好风格,什么不是。所以,我列出了一个关于这个片段的想法的小列表,我很乐意得到一些评论。除此之外,我很高兴听到一些关于如

我正在为以下情况寻找一个优雅的解决方案:

我有一个包含如下列表的类

class MyClass{ 
...
 public List<SomeOtherClass> SomeOtherClassList {get; set;}
...
}
注意:
b.SomeotherClasses
属性返回一个
列表

这段代码还远远不够完美,一些问题是因为我必须弄清楚什么是使用C#3的好风格,什么不是。所以,我列出了一个关于这个片段的想法的小列表,我很乐意得到一些评论。除此之外,我很高兴听到一些关于如何进一步改进此代码的评论

  • 临时列表
    ret
    可能是C#2中方法的一部分,但是我应该能够使用方法链接来放弃这个列表,这是正确的吗?还是我没抓住重点
  • 是否确实需要使用中间
    ToList()
    方法?我所要做的就是对选择中的每个成员执行进一步的操作
  • 这些ToList()操作的成本是多少?他们的风格好吗?必要吗

谢谢。

您正在寻找
SelectMany()
+
Distinct()

List ret=MyClassList.SelectMany(x=>x.SomeOtherClasses)
.Distinct()
.ToList();
SelectMany()
将“列表列表”展平为一个列表,然后您可以在此枚举中选择不同的条目,而不是在各个子列表之间使用并集

通常,您希望避免Linq的副作用,您最初的方法是滥用my modifying
ret
,这不是查询的一部分

ToList()
是必需的,因为每个标准查询运算符都返回一个新的枚举,并且不修改现有的枚举,因此必须将最终的枚举结果转换回列表。
ToList()
的成本是枚举的完整迭代,在大多数情况下,这一成本可以忽略不计。当然,如果您的类可以使用
IEnumerable
,那么您根本不必转换为列表。

您应该看看。类似这样的内容应该会生成“平面”列表:


它将返回一个
IEnumerable
,您可以对其进行进一步过滤/处理。

这里的unique是什么意思?我的意思是,您是否在
列表中存储了对同一对象的多个引用?太好了,这正是我要找的。它将解决问题,并删除中间.ToList()步骤。谢谢,我今天学到了一些东西。星期五好。:-)
        List<SomeOtherClass> ret = new List<SomeOtherClass>();
        MyClassList.Select(b => b.SomeOtherClasses).ToList().ForEach(l => ret = ret.Union(l).ToList()); 
        return ret;
List<SomeOtherClass> ret =  MyClassList.SelectMany( x => x.SomeOtherClasses)
                                       .Distinct()
                                       .ToList();
MyClassList.SelectMany(b => b.SomeOtherClasses)