如何组合IEnumerable <string []>

kri*_*gar 0 c# linq

我正努力提高我的LINQ技能,同时从Code Kata开始.现在,我正在尝试通过使用LINQ而不是foreach循环来改进我对这个Kata的工作.

要求:

有一个方法可以将新行('\n')上的字符串拆分成单独的字符串,然后将每个逗号分隔为最多两个数字.

这是我到目前为止所拥有的:

private int Add(string numbers) {
    var arrays = numbers.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
    var list = arrays.Select(s => s.Split(new char[] { ',', }, StringSplitOptions.RemoveEmptyEntries));

    // Additional code here...
}
Run Code Online (Sandbox Code Playgroud)

就目前而言,list是一个IEnumerable<string[]>.我一直在寻找通过各种方法LINQ( ,Join(),Aggregate()等),但没有发现任何东西,返回IEnumerable<string>.我开始认为我需要为此编写一个扩展方法,但是希望看看是否有一个我失踪的替代方法.

编辑

我的最终目标是结束IEnumerable<int>,尽管我认为在此IEnumerable<string>之前我必须停下来.如果这可以合并为一步,那就更好了.

Jon*_*eet 7

幸运的是,它非常简单 - 你只是想要SelectMany,它可以作为一个"扁平"操作:

IEnumerable<string> strings = list.SelectMany(x => x);
Run Code Online (Sandbox Code Playgroud)

或者避免Select开始,直接去SelectMany:

IEnumerable<string> list = arrays.SelectMany(s => s.Split(new char[] { ',', }, 
                                         StringSplitOptions.RemoveEmptyEntries));
Run Code Online (Sandbox Code Playgroud)

(显然你可以使用var这两种 - 为了清晰起见我只包括了类型.)

正如Habib所提到的,你甚至不需要中间arrays变量:

IEnumerable<string> list =
     numbers.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries)
            .SelectMany(s => s.Split(new char[] { ',' }, 
                                     StringSplitOptions.RemoveEmptyEntries));
Run Code Online (Sandbox Code Playgroud)

得到一个IEnumerable<int>:

IEnumerable<int> list =
     numbers.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries)
            .SelectMany(s => s.Split(new char[] { ',' }, 
                                     StringSplitOptions.RemoveEmptyEntries))
            .Select(s => int.Parse(s));
Run Code Online (Sandbox Code Playgroud)

如果任何字符串都无法解析为整数,这将抛出异常(懒惰).