Linq的Foreach替补

时间:2015-07-16 12:22:41

标签: c# excel linq epplus

我有一个查询,我想用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);
          }       
}

2 个答案:

答案 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,
           });