2015-07-16 2 views
0

У меня есть запрос, который я хочу substitue в foreach с LINQ, потому что foreach настолько медленно , как я могу написать все это codein один запрос это мой код:Foreach заменить в Linq

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); 
      }  
} 
+4

что 'Number'? Кроме того, LINQ не сделает ваш код быстрее, просто не жадным (память). – HimBromBeere

+0

В настоящее время ваш код сохраняет результат только от последнего элемента в 'Number'. – juharr

+1

Поскольку вы переписываете 'ret' на каждом проходе цикла foreach, вы можете сохранить ту же функциональность и сделать это намного быстрее, только обработав последний элемент странно названного' Number'. –

ответ

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.

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, 
      }); 
+0

от a в Отчете Присоединиться к i в пунктах на новых {aA, aB, aC, aD} равен new {iA, iB, iC, iD} ............ ......... , потому что я хочу искать каждый элемент (в пунктах) в отчете – user3122648

+0

@ user3122648 Это вопрос? Соединение будет выстраивать каждый отчет с помощью соответствующих элементов (ов) –