我正努力提高我的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>之前我必须停下来.如果这可以合并为一步,那就更好了.
幸运的是,它非常简单 - 你只是想要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)
如果任何字符串都无法解析为整数,这将抛出异常(懒惰).
| 归档时间: |
|
| 查看次数: |
381 次 |
| 最近记录: |