简单的传统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?

简单的传统foreach到Linq foreach

您要寻找的是遍历集合,并为每个项返回不同类型的项。用Select

因为在您的情况下,您可能希望从每个项目返回一个项目集合,并且不希望它们在嵌套集合中使用SelectManySplit(';')方法的结果。

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完成的。

使用SelectSplit将字符串集合转换为字符串序列的序列。SelectMany将使它成为一个字符串序列:

IEnumerable<string> myInputStrings = ...
IEnumerable<string> outputStrings = inputStrings
    .Select(inputString => inputString.Split(';'))
    .SelectMany(splitResult => splitResult);

Select将获取每个inputstring,并用分号分隔它们。输出是一个字符串数组,它实现了IEnumerable<string>,即使您的输入没有分号。

SelectMany连接字符串序列序列的每个字符串序列。结果是一个字符串序列。

使用ToArray()ToList()转换为数组或列表