Как преобразовать IEnumerable <IEnumerable <T>> к IEnumerable <T>

Я имею IEnumerable<IEnumerable<T>> набор, который я хочу преобразовать в единственный набор размера. Действительно ли возможно достигнуть этого с универсальным дополнительным методом? Прямо сейчас я делаю это для достижения его.

List<string> filteredCombinations = new List<string>();

//For each collection in the combinated results collection
foreach (var combinatedValues in combinatedResults)
{
    List<string> subCombinations = new List<string>();
    //For each value in the combination collection
    foreach (var value in combinatedValues)
    {

        if (value > 0)
        {
            subCombinations.Add(value.ToString());
        }
    }
    if (subCombinations.Count > 0)
    {
       filteredCombinations.Add(String.Join(",",subCombinations.ToArray()));
    }
}

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

5
задан Jørn Schou-Rode 10 February 2010 в 21:34
поделиться

5 ответов

Итак:

var strings = combinedResults.Select
    (
        c => c.Where(i => i > 0)
        .Select(i => i.ToString())
    ).Where(s => s.Any())
    .Select(s => String.Join(",", s.ToArray());
3
ответ дан 18 December 2019 в 06:11
поделиться

Я бы лично использовал Enumerable.SelectMany, как предложил driis.

Однако, если вы хотите реализовать это самостоятельно, было бы гораздо проще сделать так:

IEnumerable<T> MakeSingleEnumerable<T>(IEnumerable<IEnumerable<T>> combinatedResults)
{
    foreach (var combinatedValues in combinatedResults) {
         foreach (var value in combinatedValues)
              yield return value;
    }
}
3
ответ дан 18 December 2019 в 06:11
поделиться

Вы задали два разных вопроса. На тот, который вы описали в заголовке, уже ответил drilis.

Но ваш пример кода - это другая проблема. Реорганизуем его поэтапно. Шаг 1, создайте список subCombination , используя некоторый Linq:

List<string> filteredCombinations = new List<string>();

//For each collection in the combinated results collection
foreach (var combinatedValues in combinatedResults)
{
    var subCombinations = combinatedValues.Where(v => v > 0)
                                          .Select(v => v.ToString())
                                          .ToList();

    if (subCombinations.Count > 0)
       filteredCombinations.Add(string.Join(",",subCombinations.ToArray()));
}

Теперь внешний цикл, оставив нам только это:

var filteredCombinations = combinatedResults
    .Select(values => values.Where(v => v > 0)
                            .Select(v => v.ToString())
                            .ToArray())
    .Where(a => a.Count > 0)
    .Select(a => string.Join(",", a));
2
ответ дан 18 December 2019 в 06:11
поделиться

использовать linq SelectMany

0
ответ дан 18 December 2019 в 06:11
поделиться

Для этого можно использовать метод расширения Enumerable.SelectMany .

Если я правильно прочитал ваш код, код для этого будет:

var filteredCombinations = combinatedResults.SelectMany(o => o)
    .Where(value => value > 0)
    .Select(v => v.ToString());

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

var filteredCombinations = combinatedResults
     .Where(resultSet => resultSet.Any(value => value > 0)
     .Select(resultSet => String.Join(",",
         resultSet.Where(value => value > 0)
                  .Select(v => v.ToString()).ToArray()));
18
ответ дан 18 December 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: