2013-07-26 5 views
4

(см. Ниже мой фрагмент кода). Я хочу найти все элементы coll1, которые соответствуют элементам coll2 (количество элементов coll2 < = количество элементов coll1) и положить результат запроса в coll3. Как достичь этого с помощью выражения linq и лямбда? Конечно, я могу просто скопировать coll2 в coll3 :-), но это не моя цель. Я хочу знать способы использования linq и лямбда для замены такой условной логической конструкции. Заранее спасибо.Упростите обычный вложенный петли foreach с использованием выражения linq & lambda

 var coll1 = new List<int>() { 1, 2, 3, 4, 5 }; 
     var coll2 = new List<int>() { 2, 4 }; 
     var coll3 = new List<int>(); 
     foreach (var selected in coll2) 
     { 
      foreach (var item in coll1) 
      { 
       if (selected == item) 
       { 
        coll3.Add(item); 
       } 
      } 
     } 

ответ

14

Вы можете использовать Intersect

coll1.Intersect(coll2); 

Но это не будет работать, как ожидалось (см. Комментарий короля короля). Вы можете вместо этого сделать это

coll2.Where(x=>coll1.Any(y=>x==y)); 
+1

Это кажется лучшим решением для меня. +1 –

+0

@MatthewWatson спасибо .. :) – Anirudha

+0

Это ясно и выражает намерение best +1 –

1

Вы могли бы это сделать; не уверен, что это более читаемо!

var coll3 = (from selected in coll2 
       from item in coll1 
       where selected == item 
       select item).ToList(); 
+1

Это то, что предлагает resharper. –

+0

+1: полезный, читаемый, но немного длинный. :-) – MagB

+0

Интересно о нижнем. Этот код правильный, так почему? Хотя это похоже на то, что некоторые numpty просто оставили все ответы здесь ... –

6
coll3 = coll1.Where(i => coll2.Contains(i)).ToList(); 

Update. Немного проще, как это было предложено в комментариях:

coll3 = coll1.Where(coll2.Contains).ToList(); 
+0

+1: быстрый, простой, очень читаемый. –

+1

Вы можете упростить это: 'var coll3 = coll1.Where (coll2.Contains) .ToList();' –

+0

@MatthewWatson, thx, добавлено в сообщение – Andrei

2

В качестве первого шага, вы можете использовать пункт where, чтобы сделать код более читаемым:

var coll1 = new List<int>() { 1, 2, 3, 4, 5 }; 
    var coll2 = new List<int>() { 2, 4 }; 
    var coll3 = new List<int>(); 
    foreach (var selected in coll2) 
    { 
     coll3.AddRange(coll1.Where(item => selected == item)); 
    } 
+0

+1: также полезно. – MagB

0

Если вы не хотите, чтобы непосредственно присвоить результат в свой список, вы можете добавить 'ForEach' на Ваше заявление Linq:

coll1.Where(i => coll2.Contains(i)).ToList().ForEach(i => coll3.Add(i)); 

Вы возможно, захочет проверить на Distinct, хотя

Смежные вопросы