我有一个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()));
}
}
如果无法获得通用解决方案,我该如何以优雅的方式对其进行优化。
答案 0 :(得分:18)
您可以使用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()));
答案 1 :(得分:3)
我个人使用Enumerable.SelectMany,suggested by driis。
但是,如果你想自己实现这个,那就更清洁:
IEnumerable<T> MakeSingleEnumerable<T>(IEnumerable<IEnumerable<T>> combinatedResults)
{
foreach (var combinatedValues in combinatedResults) {
foreach (var value in combinatedValues)
yield return value;
}
}
答案 2 :(得分:3)
你走了:
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 :(得分:2)
你问了两个不同的问题。你在标题中描述的那个已经由drilis回答。
但是您的示例代码是另一个问题。我们可以分阶段重构它。第1步,使用Linq:
构建subCombinations
列表
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));
答案 4 :(得分:0)
使用linq SelectMany