gpt4 book ai didi

C# 在使用 LINQ 进行列表比较时性能较慢

转载 作者:行者123 更新时间:2023-12-01 23:49:27 24 4
gpt4 key购买 nike

我有这个模型的列表

public Class Contact
{
public string MobileNumber {get;set;}
public string PhoneNumber2 {get;set;}
}

我有一个方法可以将此列表与电话号码列表进行比较并返回不匹配的值

private List<ContactDto> GetNewContactsNotFoundInCrm(ContactPostModel model) 
{
var duplicates = GetAllNumbers(); // Returns a List<string> of 5 million numbers
var mobile = duplicates.Select(x => x.MobilePhone).ToList();
var telephone2 = duplicates.Select(x => x.Telephone2).ToList();

// I'm trying to compare Telephone2 and MobilePhone against the
// duplicates list of 5 million numbers. It works, but it's slow
// and can take over a minute searching for around 5000 numbers.

return model.Contacts
.Where(y =>
!mobile.Contains(y.Phonenumber.ToPhoneNumber()) &&
!telephone2.Contains(y.Phonenumber.ToPhoneNumber()) &&
!mobile.Contains(y.Phonenumber2.ToPhoneNumber()) &&
!telephone2.Contains(y.Phonenumber2.ToPhoneNumber()))
.ToList();
}

// Extension method used
public static string ToPhoneNumber(this string phoneNumber)
{
if (phoneNumber == null || phoneNumber == string.Empty)
return string.Empty;

return phoneNumber.Replace("(", "").Replace(")", "")
.Replace(" ", "").Replace("-", "");
}

我可以使用什么数据结构来比较 MobileTelephone2 与 500 万个号码的列表以获得更好的性能?

最佳答案

创建一个 HashSet 可能会解决您的问题:

    var mobile = new HashSet<string>(duplicates.Select(x => x.MobilePhone));
var telephone2 = new HashSet<string>(duplicates.Select(x => x.Telephone2));

您还可以进行其他性能改进,但与避免为您检查的每个数字迭代超过 500 万个项目相比,它们将是微观优化。

关于C# 在使用 LINQ 进行列表比较时性能较慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63673754/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com