将IList <ilist <int >>转换为单个扁平哈希集

时间:2018-09-24 23:38:39

标签: c# list casting ienumerable

我有一个列表列表,其中包含数据:

megalist = { new List {1,2}, new List {1,2}, new List{3}};

现在,我想将此IList列表转换为一个扁平化的hashset,其外观应类似于:

set = { 1,2,3 } 

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

  

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

该方法有问题吗? 非常感谢。

1 个答案:

答案 0 :(得分:9)

  

方法有问题吗?

这是一个奇怪的问题,因为显然您已经知道答案了。是的,这是错误的方法,因为它将在运行时崩溃。

Cast<T>运算符表示外部列表的每个元素必须实际上是类型T,并且列表不是集合。

退后一步。你有什么?序列序列。你想要什么?一套。您有什么可支配的后端? A method ToHashSet that turns sequences into sets

将序列操作视为工作流

Sequence of sequences --first step--> SOMETHING --second step--> Set

从后到前工作。第二步是“序列变成集合”。因此,“ SOMETHING”必须为“ sequence”:

Sequence of sequences -first step-> Sequence -ToHashSet-> Set

现在我们需要一个将序列序列变成序列的步骤。您知道该怎么做:

Sequence of sequences --SelectMany--> Sequence --ToHashSet--> Set

现在您可以编写代码:

ISet<int> mySet = megalist.SelectMany(x => x).ToHashSet();

您完成了。


快速更新:Luca在注释中指出ToHashSet在所有.NET版本中均不可用。如果没有的话,写自己的话是单线的:

static class MyExtensions
{
  public static HashSet<T> ToHashSet<T>(this IEnumerable<T> items)
  {
    return new HashSet<T>(items);
  }
}