我有一个查询,我想用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);
}
}
答案 0 :(得分:0)
正如评论中已经提到的那样,LINQ不会更快地推出一个foreach;如果你必须迭代整个集合,那么foreach将比LINQ更快。
无需检查null或内部LINQ语句中是否存在任何结果;只需添加范围,因为如果查询没有返回任何内容,LINQ查询将返回Enumerable.Empty<ReportData>
。
if (ret1 != null && ret1.ToList().Count > 0)
{
ret.AddRange(ret1);
}
// becomes
ret.AddRange(ret1);
Assumming Number
是字符串的集合,请确保没有重复项:
foreach (string item in Number.Distinct())
如果Number
是一个大型列表,数千个或更多项,请考虑使用Parallel.ForEach。
答案 1 :(得分:0)
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,
});