Я имею 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()));
}
}
Если не возможно получить универсальное решение, как я могу оптимизировать это изящным сформированным способом.
Итак:
var strings = combinedResults.Select
(
c => c.Where(i => i > 0)
.Select(i => i.ToString())
).Where(s => s.Any())
.Select(s => String.Join(",", s.ToArray());
Я бы лично использовал Enumerable.SelectMany, как предложил driis.
Однако, если вы хотите реализовать это самостоятельно, было бы гораздо проще сделать так:
IEnumerable<T> MakeSingleEnumerable<T>(IEnumerable<IEnumerable<T>> combinatedResults)
{
foreach (var combinatedValues in combinatedResults) {
foreach (var value in combinatedValues)
yield return value;
}
}
Вы задали два разных вопроса. На тот, который вы описали в заголовке, уже ответил 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));
Для этого можно использовать метод расширения 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()));