有什么方法可以使用LINQ吗?

Bla*_*ght 2 .net c# linq

我有一个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)
  • indexes是一个整数列表
  • chars是一个字符列表
  • input是一个字符串

The*_*kis 8

让我们看看你的代码做了什么.

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()扩展方法可以进一步简化它.这种方法主要列举了查询,并为您创建列表,节省您调用构造函数的麻烦和AddAddRange方法:

var chars = indexes.Select(i => input[i]).ToList();
Run Code Online (Sandbox Code Playgroud)