简单的传统foreach到Linq foreach
本文关键字:foreach Linq 传统 简单 | 更新日期: 2023-09-27 18:03:20
我有一个字符串列表,如:
abcd@domain.com
efgh@domain.com
ijkl@domain.com;mnop@domain.com;qrst@domain.com
uvwx@domain.com
yz@domain.com
我想把它设置为:
abcd@domain.com
efgh@domain.com
ijkl@domain.com
mnop@domain.com
qrst@domain.com
uvwx@domain.com
yz@domain.com
所以我写了下面的代码,它像预期的那样工作。
foreach (var email in emailAddressesOnRequest)
{
if (!string.IsNullOrEmpty(email) && email.Contains(';'))
{
emailAddressesOnRequest.AddRange(email.Split(';').ToList());
emailAddressesOnRequest.Remove(email);
}
}
是否有任何方法可以简单地将其转换为LINQ ForEach?
您要寻找的是遍历集合,并为每个项返回不同类型的项。用Select
。
因为在您的情况下,您可能希望从每个项目返回一个项目集合,并且不希望它们在嵌套集合中使用SelectMany
对Split(';')
方法的结果。
List<string> values = new List<string>
{
"abcd@domain.com",
"efgh@domain.com",
null,
"ijkl@domain.com; mnop @domain.com; qrst @domain.com",
"uvwx@domain.com",
"yz@domain.com"
};
var result = values.Where(value => !string.IsNullOrWhiteSpace(value))
.SelectMany(value => value.Split(';')).ToList();
在查询语法中:
var result = (from value in values
where !string.IsNullOrWhiteSpace(value)
from email in value.Split(';')
select email).ToList();
var query = from line in emailAddressesOnRequest
where !String.IsNullOrEmpty(line)
from email in line.Split(';')
select email;
帮助我理解ling的是标准LINQ操作符
如果您用分号将每个字符串分成子字符串,您将得到字符串序列的集合,或者IEnumerable<IEnumerable<string>>
转换为IEnumerable<string>
的IEnumareable
扩展函数为Enumerable.SelectMany
。当在SelectMany
上迭代时,它就像嵌套foreach:
List<string[]> listOfStringArrays = ...
List<string> outputList = new List<string>();
foreach (string[] stringArray in listOfStringArrays)
{
foreach (string str in stringArray)
{
outputList.Add(str);
}
}
在您的示例中,内部foreach是使用AddRange
完成的。
使用Select
和Split
将字符串集合转换为字符串序列的序列。SelectMany
将使它成为一个字符串序列:
IEnumerable<string> myInputStrings = ...
IEnumerable<string> outputStrings = inputStrings
.Select(inputString => inputString.Split(';'))
.SelectMany(splitResult => splitResult);
Select将获取每个inputstring,并用分号分隔它们。输出是一个字符串数组,它实现了IEnumerable<string>
,即使您的输入没有分号。
SelectMany
连接字符串序列序列的每个字符串序列。结果是一个字符串序列。
使用ToArray()
或ToList()
转换为数组或列表