简单的传统foreach到Linq ForEach

goo*_*now 1 c# linq foreach

我有一个字符串列表,如:

abcd@domain.com
efgh@domain.com
ijkl@domain.com;mnop@domain.com;qrst@domain.com
uvwx@domain.com
yz@domain.com
Run Code Online (Sandbox Code Playgroud)

我想要它:

abcd@domain.com
efgh@domain.com
ijkl@domain.com
mnop@domain.com
qrst@domain.com
uvwx@domain.com
yz@domain.com
Run Code Online (Sandbox Code Playgroud)

所以我编写了下面的代码,它按预期工作.

foreach (var email in emailAddressesOnRequest)
{
    if (!string.IsNullOrEmpty(email) && email.Contains(';'))
    {
        emailAddressesOnRequest.AddRange(email.Split(';').ToList());
        emailAddressesOnRequest.Remove(email);
    }
}
Run Code Online (Sandbox Code Playgroud)

LINQ ForEach有什么方法可以简单地使用它吗?

Gil*_*een 5

您正在寻找的是遍历集合并为每个项目返回不同类型的项目.为此用途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();
Run Code Online (Sandbox Code Playgroud)

在查询语法中:

var result = (from value in values
             where !string.IsNullOrWhiteSpace(value)
             from email in value.Split(';')
             select email).ToList();
Run Code Online (Sandbox Code Playgroud)