如何查找列表中属性具有特定值的所有项目或具有此值的相关项目?

时间:2014-09-03 11:27:25

标签: c# linq list

如何获取(或过滤)具有相同userID和artistID的记录的列表

这是我的评级对象

public class Rating
{
    public int userID { get; set; }
    public int artistID { get; set; }
    public int rating { get; set; }
}

这是我的数据

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 = 3, userID = 102, rating = 1 };

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

如果有记录,则输出: 其中userID = 101,和 where(artistID,其中userID为101)

我想要的输出示例:

artistID    userID      rating
1           101         2
1           102         4
2           101         3
2           102         5

我还想要1, 102, 4因为此artistID还有另一个评级,其中userID为101.同样适用于2, 102, 5

更新 如果您想要包含所有记录,其中包含不同用户但具有相同艺术家的其他记录(引自@Tim Schmelter)。您可以在更新版本中找到@Tim Schmelter的答案。

例如,如果您将rate5更改为Rating rate5 = new Rating { artistID = 3, userID = 101, rating = 1 };并添加新对象rate6 Rating rate6 = new Rating { artistID = 3, userID = 102, rating = 1 };

它会产生结果:

artistID    userID      rating
1           101         2
1           102         4
2           101         3
2           102         5
3           101         1
3           102         1

因为userID-101评级的artistID也被userid-102评级 你可以在@Tim Schmelter的回答中找到答案。

1 个答案:

答案 0 :(得分:4)

因此,您希望userID为101的所有评分或者artistID = 101的userID的评分为何?您可以在Any中使用Where

var query = ratings.Where(r =>  r.userID  == 101 || 
              ratings.Any(rr => rr.userID == 101 && r.artistID == rr.artistID));

这类似于sql中的相关子查询。

测试:

foreach (Rating r in query)
    Console.WriteLine("artistID = {0}, userID = {1}, rating = {2}"
                   , r.artistID, r.userID, r.rating);

结果:

artistID = 1, userID = 101, rating = 2
artistID = 1, userID = 102, rating = 4
artistID = 2, userID = 101, rating = 3
artistID = 2, userID = 102, rating = 5

更新 &#34;我希望所有记录中有另一条记录,但不同的用户只有同一位艺术家&#34;

现在很清楚,你想要这个:

var query = ratings
    .Where(r => ratings
        .Any(rr => r.artistID == rr.artistID && rr.userID != r.userID));