使用聚合连接isset
本文关键字:连接 isset | 更新日期: 2023-09-27 18:04:48
我试图在多个isset上使用Concat()
来制作一个更大的isset。所以我尝试了下面这段代码:
public class Foo
{
private Dictionary<Bii, ISet<Faa>> items = new Dictionary<Bii, ISet<Faa>>();
public ISet<Faa> GetCompleteList()
{
ISet<Faa> result = items.Values.Aggregate((x,y) => x.Concat(y));
return result;
}
}
问题是这会导致编译器错误:
不能隐式地将类型
System.Collections.Generic.IEnumerable<Faa>
转换为System.Collections.Generic.ISet<Faa>
。存在显式转换(您是否缺少强制类型转换?)
和第二个错误:
无法将lambda表达式转换为委托类型
System.Func<System.Collections.Generic.ISet<Faa>,System.Collections.Generic.ISet<Faa>,System.Collections.Generic.ISet<Faa>>
,因为块中的一些返回类型不能隐式转换为委托返回类型
我也试过使用像
这样的强制转换:ISet<Faa> result = items.Values.Aggregate((x,y) => (ISet<Faa>)x.Concat(y));
但这将给我一个InvalidCastException
,因为它应该是ConcatIterator
或其他类型的
我如何做一个好的cast把所有的isset连接到一个isset ?
LINQ函数如Concat
返回IEnumerable
。在此调用之后,不再有ISet
。你可以重新创建一个:
ISet<Faa> result = new HashSet<Faa>(items.Values.Aggregate((x,y) => x.Concat(y)));
或者,使用SelectMany
简化:
ISet<Faa> result = new HashSet<Faa>(items.Values.SelectMany(value => value));
你可以尝试这样做:
ISet<Faa> result = items.Values.Aggregate(new HashSet<Faa>(),
(a, x) => { a.UnionWith(x)); return a; });
如果您不想更改任何传入集合,您可以这样做:
public ISet<Faa> GetCompleteList()
{
ISet<Faa> result = new HashSet<Faa>(items.Values.SelectMany(x => x));
return result;
}
如果你不想引入一个具体的类型,你可以把它附加到第一个传入的Set上,但这样你就会改变那个小于恒星的。