Конвертировать IListв один плоский хэшсет - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть список списка с данными, такими как:

megalist = { new List {1,2}, new List {1,2}, new List{3}};

Теперь я хочу преобразовать этот список IList в один плоский hashset, который должен выглядеть следующим образом:

set = { 1,2,3 } 

Я попытался сделать megalist.Cast<ISet<int>>().SelectMany(sublist => sublist);, но это возвращает ошибку:

Невозможно привести объект типа 'System.Collections.Generic.List'1 [System.Int32]' к типу 'System.Collections.Generic.ISet'1 [System.Int32] '.

Что-то не так с подходом?Большое спасибо.

1 Ответ

0 голосов
/ 25 сентября 2018

Что-то не так с подходом?

Это странный вопрос, потому что, очевидно, вы уже знаете ответ.Да, это неправильный подход, потому что он потерпит крах во время выполнения.

Оператор Cast<T> означает, что каждый элемент внешнего списка должен на самом деле быть типа T, а список не является набором.

Взятьшаг назад.Что у тебя есть?Последовательность последовательностей.Чего ты хочешь?Множество.Что у вас есть в вашем распоряжении, чтобы получить задний план? Метод ToHashSet, который превращает последовательности в наборы .

Думайте об операциях с последовательностями как рабочие процессы .

Sequence of sequences --first step--> SOMETHING --second step--> Set

Работа от начала до конца.Второй шаг - «последовательность превращается в набор».Поэтому «SOMETHING» должно быть «sequence»:

Sequence of sequences -first step-> Sequence -ToHashSet-> Set

Теперь нам нужен шаг, который превращает последовательность последовательностей в последовательность.Вы знаете, как это сделать:

Sequence of sequences --SelectMany--> Sequence --ToHashSet--> Set

И теперь вы можете написать код:

ISet<int> mySet = megalist.SelectMany(x => x).ToHashSet();

И все готово.


Быстрое обновление: Лука отмечает в комментарии, что ToHashSet доступен не во всех версиях .NET.Если у вас его нет, пишите самостоятельно:

static class MyExtensions
{
  public static HashSet<T> ToHashSet<T>(this IEnumerable<T> items)
  {
    return new HashSet<T>(items);
  }
}
...