将IList <IList <int >>转换为单个展平的哈希集

lea*_*arn 0 c# ienumerable casting list

我有一个包含以下数据的列表:

megalist = { new List {1,2}, new List {1,2}, new List{3}};
Run Code Online (Sandbox Code Playgroud)

现在,我想将此列表IList转换为单个扁平化hashset,应该如下所示:

set = { 1,2,3 } 
Run Code Online (Sandbox Code Playgroud)

我尝试过, megalist.Cast<ISet<int>>().SelectMany(sublist => sublist);但返回错误:

无法将类型为'System.Collections.Generic.List'1 [System.Int32]'的对象强制转换为'System.Collections.Generic.ISet'1 [System.Int32]'.

这种方法有问题吗?非常感谢.

Eri*_*ert 9

这种方法有问题吗?

这是一个奇怪的问题,因为很明显你已经知道了答案.是的,这是错误的方法,因为它会在运行时崩溃.

Cast<T>操作者指外列表中的每个元素必须实际上是 类型T,和一个列表是不是一个组.

退后一步.你有什么?一系列序列.你想要什么?一套.你有什么可以随意设置后端? 将序列转换为集合的方法ToHashSet.

将序列操作视为工作流程.

Sequence of sequences --first step--> SOMETHING --second step--> Set
Run Code Online (Sandbox Code Playgroud)

从后到前工作.第二步是"序列变为集合".因此"SOMETHING"必须是"序列":

Sequence of sequences -first step-> Sequence -ToHashSet-> Set
Run Code Online (Sandbox Code Playgroud)

现在我们需要一个将序列序列转换为序列的步骤.你知道怎么做:

Sequence of sequences --SelectMany--> Sequence --ToHashSet--> Set
Run Code Online (Sandbox Code Playgroud)

现在你可以编写代码了:

ISet<int> mySet = megalist.SelectMany(x => x).ToHashSet();
Run Code Online (Sandbox Code Playgroud)

而且你已经完成了.


快速更新:Luca在评论中指出ToHashSet,并非在所有版本的.NET中都可用.如果你没有它,那就自己写一个单行:

static class MyExtensions
{
  public static HashSet<T> ToHashSet<T>(this IEnumerable<T> items)
  {
    return new HashSet<T>(items);
  }
}
Run Code Online (Sandbox Code Playgroud)