使用LINQ我有一个列表列表,如何选择每个列表中存在的所有对象?

Nib*_*Pig 3 c# linq

我有一份清单清单:

List<Tuple<string, List<SomeObject>>
Run Code Online (Sandbox Code Playgroud)

我想选择SomeObjects上面列表的所有行中存在的所有内容.

有些只会存在于一个或两个列表中,但我希望所有对象都存在于每个列表中,而其他对象则被丢弃.

如果没有一堆c#代码,我无法找到一个优雅的解决方案.有一个很好的方式吗?

Jua*_*pes 7

list.Select (x => x.Item2 as IEnumerable<SomeObject>)
    .Aggregate((x,y)=> x.Intersect(y))
    .ToList();
Run Code Online (Sandbox Code Playgroud)

或者,正如Jeppe Stig Nielsen所说(我觉得它更优雅):

list.Select(x => x.Item2.AsEnumerable())
    .Aggregate(Enumerable.Intersect)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

  • `Aggregate <>`的相关重载只有一个类型参数`TSource`.你需要`TSource`是`IEnumerable <SomeObject>`,而不是`List <SomeObject>`.所以包含"as enumerable"有助于此.当然,另一种方法是明确地给出类型参数.只是为了强调可以使用`TSource == List <SomeObject>`,这也有效:`list.Select(x => x.Item2).Aggregate((x,y)=> x.Intersect(y ).ToList());`(不要使用,为每次迭代创建新的`List <>`实例). (2认同)