使用 ToLower 迭代整个列表并更新字符串 - 不起作用
Iterating whole list and updating string using ToLower - Not working
使用的技术。
- C#
- .NET 4.0
- 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))
{
// ...
}
使用的技术。
- C#
- .NET 4.0
- 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))
{
// ...
}