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的好风格,什么不是。所以,我列出了一个关于这个片段的想法的小列表,我很乐意得到一些评论。除此之外,我很高兴听到一些关于如何进一步改进此代码的评论
- 临时列表
可能是C#2中方法的一部分,但是我应该能够使用方法链接来放弃这个列表,这是正确的吗?还是我没抓住重点ret
- 是否确实需要使用中间
方法?我所要做的就是对选择中的每个成员执行进一步的操作ToList()
- 这些ToList()操作的成本是多少?他们的风格好吗?必要吗
谢谢。您正在寻找
SelectMany()
+Distinct()
:
List ret=MyClassList.SelectMany(x=>x.SomeOtherClasses)
.Distinct()
.ToList();
SelectMany()
将“列表列表”展平为一个列表,然后您可以在此枚举中选择不同的条目,而不是在各个子列表之间使用并集
通常,您希望避免Linq的副作用,您最初的方法是滥用my modifyingret
,这不是查询的一部分
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)