使用 ToLower 迭代整个列表并更新字符串 - 不起作用

Iterating whole list and updating string using ToLower - Not working

使用的技术。

  1. C#
  2. .NET 4.0
  3. Visual Studio 2010

问题。

我有一个 List<User>,其中包含一个 Email 属性。我想将列表中的所有电子邮件地址都小写,但我的实现不起作用。我正在使用以下语句:

emails.ToList().ForEach(e => e.ToLower());

这对 Catherine.Burke@email.co.uk 这样的电子邮件地址根本不起作用。我构建了以下内容来对此进行测试:

    string email = "Catherine.Burke@email.co.uk";
    email = email.ToLower();
    Console.WriteLine("Email: " + email);

    string email2 = "Catherine.Burke@email.co.uk";
    string email3 = "Gareth.bradley@email.co.uk";

    List<string> emails = new List<string>();
    emails.Add(email2);
    emails.Add(email3);
    emails.ToList().ForEach(e => e.ToLower());
    emails.ToList().ForEach(delegate(string e)
    {
        Console.WriteLine("ForEach deletegate : " + e);
    });

    List<EmailAddress> emailAddresses = new List<EmailAddress>();
    emailAddresses.Add(new EmailAddress { FullAddress = "Catherine.Burke@email.co.uk" });
    emailAddresses.Add(new EmailAddress { FullAddress = "Gareth.bradley@email.co.uk" });
    emailAddresses.ToList().ForEach(e => e.FullAddress.ToLower());
    emailAddresses.ToList().ForEach(delegate(EmailAddress e)
    {
        Console.WriteLine("EmailAddress delegate: " + e.FullAddress);
    });

    foreach (EmailAddress em in emailAddresses)
    {
        Console.WriteLine("Foreach Print: " + em.FullAddress);
    }

现在我认为它可能是文化,因为这些是名称,所以它们保持大写,但是当我在单个字符串上使用 ToLower() 时它起作用了。上面的 运行 具有以下输出,如您所见,第一行显示了一个带有小写字符的电子邮件地址,而我尝试使用 ForEach() 的各种列表的实现都没有奏效。我假设我对 ForEach() 的实施不正确?

emails.ToList().ForEach(e => e.ToLower()); 只调用 ToLower() 但不分配结果。

你想要的是:

var lowerEmails = emails.Select(e => e.ToLower()).ToList();

试试这个:

emailAddresses.ToList().ForEach(e => e.FullAddress = e.FullAdress.ToLower());

正如 weertzui 已经提到的那样,ForEach-方法只是调用委托。但是,您的代码中不会以任何方式使用此操作的结果。

但是我强烈建议使用简单的 foreach:

foreach(var mail in emailadresses) mail.FullAdress = mail.FullAdress.ToLower();

这对我来说似乎更易读。

按要求将我的评论作为答案:

使用简单的 for 循环。 List.ForEach 是一种获取 string 作为参数的方法,您不能在那里替换整个引用,并且由于字符串是不可变的,您也不能更改它们。您必须将 String.ToLower 返回的 string 重新分配给您的变量:

for(int i = 0; i < emails.Count; i++)
    emails[i] = emails[i].ToLower(); 

旁注:如果您将所有电子邮件都设为小写以获得不区分大小写的比较,最好使用 String.Equals 重载和正确的 StringComparison

string email1 = "Catherine.Burke@email.co.uk";
string email2 = "catherine.burke@email.co.uk";
if (String.Equals(email1, email2, StringComparison.InvariantCultureIgnoreCase))
{
     // ...
}