SelectMany
делает именно это. На высоком уровне (опуская дженерики и упрощающего немного), SelectMany
реализуется как:
static IEnumerable SelectMany(this source, Func selector)
{
IEnumerable results;
foreach (var item in source)
{
foreach (var result in selector(item))
{
results.add(result);
}
}
return results;
}
Приведенный выше код на самом деле не точны; вместо этого он использует возврат доходности для выполнения выбора лениво и не использует промежуточную коллекцию results
. Наконец, полная подпись на самом деле public static IEnumerable<TResult> SelectMany<TSource, TResult>( this IEnumerable<TSource> source, Func<TSource, IEnumerable<TResult>> selector)
, но единственной важной частью, которую нужно понять, является то, что селектор возвращает коллекцию. Если у вас есть коллекция коллекций, то использование функции идентификации x => x
делает именно это.
Таким образом, он сглаживает коллекции коллекций в одну коллекцию. Использование функции идентификации x => x
в качестве селектора означает, что элементы внутренних коллекций не изменяются. Так что, как некоторые другие выложили, окончательный ответ будет:
var newSet = new HashSet(setOfSets.SelectMany(element => element));
'SelectMany' .. –