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

时间:2016-02-01 15:12:38

标签: c# list email .net-4.0

技术使用。

  1. C#
  2. .NET 4.0
  3. Visual Studio 2010
  4. 问题。

    我有List<User>,其中包含电子邮件属性。我想小写列表中的所有电子邮件地址,但我的实现不起作用。我使用以下声明:

    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()时它起作用了。以上输出使用以下输出,因为您可以看到第1行显示带有小写字符的电子邮件地址,而我尝试使用ForEach()的各种List的实现无法正常工作。我假设ForEach()的实施不正确?

    enter image description here

3 个答案:

答案 0 :(得分:1)

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

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

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))
{
     // ...
}

答案 1 :(得分:0)

layer.events.register("touchstart", layer, function(e) { //e.xy is undefined }); 只会调用emails.ToList().ForEach(e => e.ToLower());,但不会分配结果。

你想要的是:

ToLower()

答案 2 :(得分:0)

试试这个:

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

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

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

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

这对我来说似乎更具可读性。