如何转换IEnumerable <ienumerable <t>&gt;到IEnumerable <t> </t> </ienumerable <t>

时间:2010-02-10 21:06:52

标签: c# collections extension-methods

我有一个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 个答案:

答案 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.SelectManysuggested 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