【发布时间】:2014-08-22 01:19:41
【问题描述】:
我有几个看起来像这样的类(简化为 SO):
public class Result
{
pubic List<Review> Reviews { get; set; }
}
public class Review
{
public string Name { get; set; }
public int Amount { get; set; }
}
我开始的是一个List<Result> 对象。列表中的每个“结果”对象显然都有另一个 List 属性。在每个“结果”对象中,其评论列表永远不会有重复的“名称”属性。但是,在预期的情况下,列表中的所有 Result 对象都会有重复的“名称”属性。
例如:
var results = new List<Result>();
var result1 = new Result();
result1.Reviews = new List<Review>();
result1.Reviews.Add(new Review { Name = "ABC", Amount = 5 });
result1.Reviews.Add(new Review { Name = "DEF", Amount = 4 });
results.Add(result1);
var result2 = new Result();
result2.Reviews = new List<Review>();
result2.Reviews.Add(new Review { Name = "ABC", Amount = 1 });
result2.Reviews.Add(new Review { Name = "WRA", Amount = 4 });
results.Add(result2);
var result3 = new Result();
result3.Reviews = new List<Review>();
result3.Reviews.Add(new Review { Name = "ABC", Amount = 2 });
result3.Reviews.Add(new Review { Name = "ARA", Amount = 4 });
results.Add(result3);
因此,您可以看到,在整个结果列表中,名称“ABC”在评论列表中重复出现。我需要做的是编写一个 LINQ 查询,对 results 对象进行操作,该对象将从子列表中删除所有重复的 Review 对象,最高的除外。因此,在这种情况下,result2 和 result3 的“ABC”评论都会从列表中完全删除。
关于如何使用 LINQ 执行此操作的任何建议?我也在自己寻找解决方案,只是想我会在这里发布,看看它是否比我自己解决它更快。 :)
【问题讨论】:
-
不太确定,但是
var query = result1.Reviews.Concat(result2.Reviews).Concat(result3.Reviews).GroupBy(r => r.Name).Select(grp => new Review { Name = grp.Key, Amount = grp.Max(r => r.Amount)});呢 -
结果对象的数量未定义。我不想那样硬编码,但谢谢。
-
在这种情况下,您可以使用
SelectMany获取Review的扁平列表,例如List<Review> reviewList = list.SelectMany(r => r.Reviews).ToList();,其中您的list是List<Result> -
“最高”是指
Review最大的Amount?