2014-09-05 48 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> ratings2过滤List<Rating> ratings

在这个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>快lookup:

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

'Join'应该是'GroupJoin'来避免潜在的重复项目。 – Servy 2014-09-05 15:41:42

+0

你不需要'group by',只需要'into'。这将执行“GroupJoin”而不是“Join”,然后是“GroupBy”。 – Servy 2014-09-05 15:54:53

+0

感谢您指出可能与连接重复的问题,我已经完全删除了连接方法,我更喜欢HashSet。 – 2014-09-05 16:01:01