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]'.
这种方法有问题吗?非常感谢.
这种方法有问题吗?
这是一个奇怪的问题,因为很明显你已经知道了答案.是的,这是错误的方法,因为它会在运行时崩溃.
甲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)
归档时间: |
|
查看次数: |
243 次 |
最近记录: |