Конкатенация ISet с использованием Aggregate - PullRequest
0 голосов
/ 05 августа 2011

Я пытаюсь использовать Concat() на нескольких ISets, чтобы сделать один больший 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>.Существует явное преобразование (вам не хватает приведения?)

И вторая ошибка:

Невозможно преобразовать лямбда-выражение в тип делегата 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 или что-то в этом роде.

Как мне сделать хороший бросок, чтобы объединить все ISets в один ISet?

Ответы [ 3 ]

2 голосов
/ 05 августа 2011

Функции 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));
1 голос
/ 05 августа 2011

Вы можете попробовать что-то вроде этого:

ISet<Faa> result = items.Values.Aggregate(new HashSet<Faa>(),
                                          (a, x) => { a.UnionWith(x)); return a; });
0 голосов
/ 05 августа 2011

Если вы не хотите изменять любой из входящих наборов, вы можете сделать что-то вроде этого:

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

Если вы не хотите вводить конкретный тип, вы можете добавить к первому входящемуУстановите, но тогда вы изменили бы то, что меньше звездного.

...