1

我有以下方法

/// <summary>
    /// Replaces SemiColons with commas because SMTP client does not accept semi colons
    /// </summary>
    /// <param name="emailAddresses"></param>
    public static List<string> ReplaceSemiColon(List<string> emailAddresses) // Note only one string in the list...
    {         
        foreach (string email in emailAddresses)
        {
            email.Replace(";", ",");
        }

        //emailAddresses.Select(x => x.Replace(";", ","));  // Not working either


        return emailAddresses;
    }

但是,电子邮件字符串不会替换“;” 与“,”。我错过了什么?

4

5 回答 5

4

String.Replace方法返回字符串。它不会改变现有的。

返回一个新字符串,其中当前字符串中出现的所有指定 Unicode 字符或字符串都替换为另一个指定的 Unicode 字符或字符串。

正如 Habib提到的,foreach与当前列表一起使用会导致foreach 迭代变量错误。这是一个只读迭代。创建一个新列表,然后向其中添加替换值。

您也可以使用 for 循环来修改keyboardP 在他的回答中解释的现有列表。

List<string> newemailAddresses = new List<string>();
foreach (string email in emailAddresses)
{         
     newemailAddresses.Add(email.Replace(";", ","));
}
return newemailAddresses;

请注意,由于字符串是不可变类型,因此您无法更改它们。即使你认为你改变了它们,你实际上也创建了新的字符串对象。

于 2013-09-27T14:19:42.323 回答
4

正如其他人已经提到的那样,字符串是不可变的 string.Replace将返回一个新字符串,它不会修改现有字符串)并且您不能在foreach循环内修改列表。您可以使用for循环修改现有列表或使用 LINQ 创建新列表并将其分配回现有列表。喜欢:

emailAddresses = emailAddresses.Select(r => r.Replace(";", ",")).ToList();

记得包括使用System.Linq;

于 2013-09-27T14:37:41.570 回答
4

我认为您应该尝试将其设置回自身email = email.Replace(";", ",");

于 2013-09-27T14:19:21.487 回答
3

字符串是不可变的,因此返回另一个字符串。尝试

for(int i = 0; i < emailAddress.Count; i++)
{
   emailAddress[i] = emailAddress[i].Replace(";", ",");
}

foreach 循环不会在这里编译,因为您正在尝试更改迭代变量。你会遇到这个问题

于 2013-09-27T14:20:11.173 回答
0

你应该使用类似的东西: var tmpList = new List(); 将每个修改后的电子邮件地址添加到 tmplist,完成后,返回 TmpList。在 .NET 中,字符串是不可变的,这就是您的代码不起作用的原因。

于 2013-09-27T14:21:20.800 回答