我有一个列表列表,其中包含数据:
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]'。
该方法有问题吗? 非常感谢。
答案 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);
}
}