C# 是否有更优化的LINQ对象搜索方法?

C# 是否有更优化的LINQ对象搜索方法?,c#,linq,C#,Linq,给定以下DTO和LINQ查询: public class DupeCheckRecordsDto { public string A_HOMEPHONE_ { get; set; } public string A_WORKPHONE_ { get; set; } public string A_MOBILEPHONE_ { get; set; } public string A_SSNO_ { get; set; } public string A_EM

给定以下DTO和LINQ查询:

public class DupeCheckRecordsDto
{
    public string A_HOMEPHONE_ { get; set; }
    public string A_WORKPHONE_ { get; set; }
    public string A_MOBILEPHONE_ { get; set; }
    public string A_SSNO_ { get; set; }
    public string A_EMAILADDRESS_ { get; set; }
}


var phones =
    new[]
    {
        leadApplication.CellPhone,
        leadApplication.DayPhone,
        leadApplication.EveningPhone,
        leadApplication.OtherPhone
    };

List<DupeCheckRecordsDto> listOfDays = _backEndRepository.DupeCheckRecords(daysBack).ToList();

bool matchFound = false;

foreach (var phone in phones)
{
    bool result = listOfDays.Any(p => p.A_HOMEPHONE_ == phone || p.A_MOBILEPHONE_ == phone || p.A_WORKPHONE_ == phone);
    if (!result) continue;
    matchFound = true; 
    break;
}
公共类dupecheckrecordsdo
{
公共字符串A_HOMEPHONE_u{get;set;}
公共字符串A_工作电话{get;set;}
公共字符串A_MOBILEPHONE_u{get;set;}
公共字符串A_SSNO{get;set;}
公共字符串A_EMAILADDRESS_{get;set;}
}
var电话=
新[]
{
leadApplication.phone,
leadApplication.DayPhone,
leadApplication.NingPhone,
leadApplication.OtherPhone
};
List listOfDays=_backEndRepository.DupeCheckRecords(daysBack.ToList();
bool matchFound=false;
foreach(电话中的var电话)
{
bool result=listOfDays.Any(p=>p.A_HOMEPHONE==phone | | p.A_MOBILEPHONE==phone | | p.A_WORKPHONE==phone);
如果(!result)继续;
matchFound=true;
打破
}
listOfDays的具体化很快,所以我并没有在那个里寻找优化,我关心的是Any和循环结构的使用

谢谢,,
Stephen

这里有一种消除foreach语法的方法,但我希望它的性能大致相同

bool matchFound = listOfDays.Any(p =>
  phones.Contains(p.A_HOMEPHONE_) || 
  phones.Contains(p.A_MOBILEPHONE) ||
  phones.Contains(p.A_WORKPHONE_));

这里有一种消除foreach语法的方法,但我希望它的性能大致相同

bool matchFound = listOfDays.Any(p =>
  phones.Contains(p.A_HOMEPHONE_) || 
  phones.Contains(p.A_MOBILEPHONE) ||
  phones.Contains(p.A_WORKPHONE_));
那么这个呢:

 bool matchFound = listOfDays.Any(p => phones.Any(phone=> p.A_HOMEPHONE_ == phone || p.A_MOBILEPHONE_ == phone || p.A_WORKPHONE_ == phone));

 bool matchFound = listOfDays.Any(p => phones.Contains(p.A_HOMEPHONE_) ||phones.Contains(p.A_MOBILEPHONE_) ||phones.Contains(p.A_WORKPHONE_ ));
那么这个呢:

 bool matchFound = listOfDays.Any(p => phones.Any(phone=> p.A_HOMEPHONE_ == phone || p.A_MOBILEPHONE_ == phone || p.A_WORKPHONE_ == phone));

 bool matchFound = listOfDays.Any(p => phones.Contains(p.A_HOMEPHONE_) ||phones.Contains(p.A_MOBILEPHONE_) ||phones.Contains(p.A_WORKPHONE_ ));
对。更改此项:

var phones =
    new[]
    {
        leadApplication.CellPhone,
        leadApplication.DayPhone,
        leadApplication.EveningPhone,
        leadApplication.OtherPhone
    };
致:

您不需要foreach(电话中的var电话)。以上内容将在一次过程中搜索所有四个

这里的要点是,您只需扫描列表中的内容
HashSet.Contains
是一个O(1)操作。所以每一张唱片你只看一次

在你的原稿中,每一张唱片你都要看四遍

如果将
phones
作为一个数组保留,则执行
phones.Contains
将必须与列表中的每个项目进行比较。使用
哈希集
,它只执行一次查找

这会快多少还不清楚,因为
电话
列表有点小。

是的。更改此项:

var phones =
    new[]
    {
        leadApplication.CellPhone,
        leadApplication.DayPhone,
        leadApplication.EveningPhone,
        leadApplication.OtherPhone
    };
致:

您不需要foreach(电话中的var电话)。以上内容将在一次过程中搜索所有四个

这里的要点是,您只需扫描列表中的内容
HashSet.Contains
是一个O(1)操作。所以每一张唱片你只看一次

在你的原稿中,每一张唱片你都要看四遍

如果将
phones
作为一个数组保留,则执行
phones.Contains
将必须与列表中的每个项目进行比较。使用
哈希集
,它只执行一次查找

这会快多少还不清楚,因为
phones
列表有点小