【发布时间】:2020-11-18 09:55:41
【问题描述】:
我有这些课程:
public class AlertEvaluation
{
public string AlertId { get; set; }
public ICollection<EvaluatedTag> EvaluatedTags { get; set; }
public string TransactionId { get; set; }
public EvaluationStatus EvaluationStatus { get; set; }
public DateTime EvaluationDate { get; set; }
}
public class EvaluatedTag
{
public string Id { get; set; }
public string Name { get; set; }
}
我想获得按AlertId 和EvaluatedTags 分组的警报评估列表,这意味着我想比较和分组评估不仅具有相同的AlertId,而且还具有EvaluatedTags 的相同列表。 (并且还能及时得到最后的评价)
我试过这个:
var evaluationsGroupedAndOrdered = evaluations.GroupBy(x => new { x.AlertSettingId, x.EvaluatedLabels })
.Select(x => x.OrderByDescending(z => z.EvaluationDate ).FirstOrDefault()).ToList();
当然,这样的列表属性比较是行不通的。
我在GroupBy 中阅读了有关添加相等比较器的内容,这意味着比较对象内的列表对吗?但我不确定如何以正确的方式实现它。
我试过了(基于GroupBy on complex object (e.g. List<T>)):
public class AlertEvaluationComparer : IEqualityComparer<AlertEvaluation>
{
public bool Equals(AlertEvaluation x, AlertEvaluation y)
{
return x.AlertId == y.AlertId && x.EvaluatedTags.OrderBy(val => val.Name).SequenceEqual(y.EvaluatedTags.OrderBy(val => val.Name));
}
public int GetHashCode(AlertSettingEvaluation x)
{
return x.AlertId.GetHashCode() ^ x.EvaluatedTags.Aggregate(0, (a, y) => a ^ y.GetHashCode());
}
}
但也没有用。也许是因为我的 EvaluatedTags 列表不是字符串列表,而是单个对象的列表。
有人对此有很好的解决方案吗?
【问题讨论】:
-
你确定
GroupBy(x => x.AlertId, x.EvaluatedTags)会编译吗?它应该是GroupBy(x => new { x.AlertId, x.EvaluatedTags})或GroupBy(x => (x.AlertId, x.EvaluatedTags))。 -
在
EvaluatedTag方法中覆盖Equals()和GetHashcode()可能会简化linq代码。 -
@PavelAnikhouski,stackoverflow.com/questions/35128996/… 的解决方案对我不起作用。显示的列表中有一个字符串列表,它在 GetHashCode 方法中获取这些字符串的哈希码。我的列表是对象列表
-
@RufusL 是的,但是我怎样才能以正确的方式实现 Equals() 和 GetHashcode() 呢?
标签: c# .net linq group-by iequalitycomparer