2014-09-05 13 views
0

Например, у меня есть списокКак отфильтровать список по элементу списка

Rating rate1 = new Rating { artistID = 1, userID = 101, rating = 2 }; 
Rating rate2 = new Rating { artistID = 1, userID = 102, rating = 4 }; 
Rating rate3 = new Rating { artistID = 2, userID = 101, rating = 3 }; 
Rating rate4 = new Rating { artistID = 2, userID = 102, rating = 5 }; 
Rating rate5 = new Rating { artistID = 2, userID = 103, rating = 1 }; 
Rating rate6 = new Rating { artistID = 3, userID = 102, rating = 1 }; 
Rating rate7 = new Rating { artistID = 3, userID = 103, rating = 1 }; 

List<Rating> ratings = new List<Rating>(7); 
ratings.Add(rate1); 
ratings.Add(rate2); 
ratings.Add(rate3); 
ratings.Add(rate4); 
ratings.Add(rate5); 
ratings.Add(rate6); 
ratings.Add(rate7); 

и у меня есть второй список,

List<Rating> ratings2 = new List<Rating>(2); 
ratings2.Add(rate1); 
ratings2.Add(rate3); 

Теперь я хочу, чтобы фильтровать List<Rating> ratings с List<Rating> ratings2.

В этом CACE мы используем artistID элемент для фильтрации списка оценок, в другом слове я хочу, чтобы включить весь список, которые содержат artistID1 и 2, которые перечислены в ratings2

Спасибо.

ответ

3

Если вы только собираетесь сравнивать artistID, то вы можете сделать:

List<Rating> resultList = ratings.Where(r => ratings2.Select(t => t.artistID) 
              .Contains(r.artistID)) 
              .ToList(); 

выше отберет artistIDs для второго списка ratings2 сделать сравнение, похожий на SELECT * from Table WHERE ID IN (1,2)

3

Вы можете использовать HashSet<int> так быстро поиск:

var r2Artists = new HashSet<int>(ratings2.Select(r2 => r2.artistID)); 
var result = ratings.Where(r => r2Artists.Contains(r.artistID)); 
+0

'Join' должен быть' GroupJoin', чтобы избежать потенциально повторяющихся элементов. – Servy

+0

Вам не нужна «группа», просто «в». Это будет выполнять «GroupJoin», а не «Join», за которым следует «GroupBy». – Servy

+0

Спасибо, что указали на возможную дублируемую проблему с join, я полностью удалил подход join, я предпочитаю HashSet. –