C# 是否有更优化的LINQ对象搜索方法?
给定以下DTO和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
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
列表有点小