求Linq中的每个代换项
本文关键字:Linq | 更新日期: 2023-09-27 18:03:05
我有一个查询,我想用linq代替foreach
,因为foreach
太慢了我如何在一个查询中编写所有这些代码这是我的代码:
ret = new List<ReportData>();
foreach (var item in Number)
{
string A = item.Substring(0, 11);
string B = item.Substring(14, 2);
string C = item.Substring(19, 11);
string D = item.Substring(33);
ret1 = (from a in Report
where a.A == A && a.B == B && a.C == C && a.D == D && Filter.Type.Contains(a.Y)
select new ReportData
{
X = a.X,
Y = a.Y,
});
if (ret1 != null && ret1.ToList().Count > 0)
{
ret.AddRange(ret1);
}
}
正如已经在评论中提到的,LINQ不会使查询更快;如果你必须迭代整个集合,那么foreach将比LINQ更快。
内部LINQ语句中不需要检查null或是否存在任何结果;只要添加范围,因为LINQ查询将返回一个Enumerable.Empty<ReportData>
,如果没有从查询返回。
if (ret1 != null && ret1.ToList().Count > 0)
{
ret.AddRange(ret1);
}
// becomes
ret.AddRange(ret1);
假设Number
是一个字符串集合,确保没有重复项:
foreach (string item in Number.Distinct())
如果Number
是一个大列表,有数千个或更多的项目,那么考虑使用Parallel.ForEach。
Linq将像foreach
一样枚举集合,但是您可能从join
中看到一些好处:
var items = Number.Select( item => new {
A = item.Substring(0, 11),
B = item.Substring(14, 2),
C = item.Substring(19, 11),
D = item.Substring(33),
});
var ret = (from a in Report
join i in items
on new {a.A, a.B, a.C, a.D} equals new {i.A, i.B, i.C, i.D}
where Filter.Type.Contains(a.Y)
select new ReportData
{
X = a.X,
Y = a.Y,
});