我有一个foreach循环,我想用LINQ做
foreach (int i in indexes)
{
char[] ch = new char[1];
input.CopyTo(i, ch, 0, 1);
chars.Add(ch[0]);
}
Run Code Online (Sandbox Code Playgroud)
让我们看看你的代码做了什么.
char[] ch = new char[1];
input.CopyTo(i, ch, 0, 1);
Run Code Online (Sandbox Code Playgroud)
这是以下文件CopyTo:
将指定位数从此实例中的指定位置复制到Unicode字符数组中的指定位置.
因此,您始终将字符串的单个字符复制到长度为1的字符缓冲区.特别是对于这种情况,有一种更简单的方法 - 它甚至不涉及临时字符缓冲区:
char ch = input[i];
Run Code Online (Sandbox Code Playgroud)
现在,您的下一行变得更加简单:
chars.Add(ch);
Run Code Online (Sandbox Code Playgroud)
所以,总的来说你有这个:
var ch = input[i];
chars.Add(ch);
Run Code Online (Sandbox Code Playgroud)
此变量仅使用一次,显然可以在使用它的位置内联:
chars.Add(input[i]);
Run Code Online (Sandbox Code Playgroud)
所以整个循环变成:
foreach (var i in indexes)
{
chars.Add(input[i]);
}
Run Code Online (Sandbox Code Playgroud)
这是一个foreach循环的特例,其中每个迭代计算"something"(input[i]),最后它将"something"添加到collection(chars.Add).幸运的是,这也是一个非常典型的循环,可以很容易地变成LINQ.
首先,您需要识别源,这通常是您执行的对象foreach:
indexes
Run Code Online (Sandbox Code Playgroud)
然后,您需要识别选择器,它是计算您正在添加的"某些东西"的代码,并将该代码传递给Select方法:
.Select(i => input[i])
Run Code Online (Sandbox Code Playgroud)
在这一点上,你有这个:
indexes.Select(i => input[i]);
Run Code Online (Sandbox Code Playgroud)
您可以将其添加到列表中:
chars.AddRange(indexes.Select(i => input[i]));
Run Code Online (Sandbox Code Playgroud)
但是如果你有一个特殊的情况,列表是空的(例如,因为你刚刚创建它),那么你现在可能正在看这样的事情:
var chars = new List<char>();
chars.AddRange(indexes.Select(i => input[i]));
Run Code Online (Sandbox Code Playgroud)
这也是一种非常常见的情况,并且ToList()扩展方法可以进一步简化它.这种方法主要列举了查询,并为您创建列表,节省您调用构造函数的麻烦和Add或AddRange方法:
var chars = indexes.Select(i => input[i]).ToList();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |