求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中的每个代换项

正如已经在评论中提到的,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,
           });