使用聚合连接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 ?

使用聚合连接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上,但这样你就会改变那个小于恒星的。