0

Concat()複数の ISet で使用して、1 つの大きな ISet を作成しようとしています。そこで、次のコードを試しました。

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>。明示的な変換が存在します (キャストがありませんか?)

そして2番目のエラー:

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ます。

すべての ISet を 1 つの ISet に結合するにはどうすれば良いキャストを行うことができますか?

4

3 に答える 3

2

などの LINQ 関数は、 をConcat返しますIEnumerableISetこの呼び出しの後はもうありません。ただし、再構築できます。

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));
于 2011-08-05T11:22:17.227 に答える
1

次のようなことを試すことができます:

ISet<Faa> result = items.Values.Aggregate(new HashSet<Faa>(),
                                          (a, x) => { a.UnionWith(x)); return a; });
于 2011-08-05T11:20:59.007 に答える
0

着信セットを変更したくない場合は、次のようにすることができます。

public ISet<Faa> GetCompleteList()
{
    ISet<Faa> result = new HashSet<Faa>(items.Values.SelectMany(x => x));
    return result;
}

具体的なタイプを導入したくない場合は、最初の受信セットに追加できますが、恒星よりも小さいものを変更することになります。

于 2011-08-05T11:26:08.650 に答える