我正在尝试计算两个列表之间的差异我的列表类型具有以下结构:
public partial class Assistance
{
public int Id { get; set; }
public string AssistanceName { get; set; }
public string AssistanceTell { get; set; }
}
这是我的疑问:
List<Assistance> assistanceWithoutExpert;
AssistanceJurorRepository assistanceJurorRepository = new AssistanceJurorRepository();
List<Assistance> assistancesWithExpert = assistanceJurorRepository.FindBy(i => i.User.Permission == "Assistance").Select(i => i.Assistance).ToList();
List<Assistance> AllAssitance = GetAll().ToList();
assistanceWithoutExpert = AllAssitance.Except(assistancesWithExpert).ToList();
return assistanceWithoutExpert;
正如您所看到的,我有一个列表,其中包含所有名为AllAssitance
的助手,以及一个包含expert
名为assistancesWithExpert
的助手的列表,我需要计算assistanceWithoutExpert
。所以,但在执行结果后,AllAssitance
中的所有记录都是为什么?
祝你好运
答案 0 :(得分:2)
您需要使用overload which takes a comparer。它没有开箱即用的复杂类型。
public class AssistanceComparer: IEqualityComparer<Assistance>
{
public bool Equals(Assistance x, Assistance y)
{
return x.ID == y.ID;
}
public int GetHashCode(Assistance assistance)
{
return assistance.ID.GetHashCode();
}
}
用法:
assistanceWithoutExpert = AllAssitance.Except(assistancesWithExpert, new AssistanceComparer()).ToList();
答案 1 :(得分:1)
使用默认的相等比较器完成比较。来自MSDN:
使用默认的相等比较器来比较值,生成两个序列的集合差异。
您需要通过覆盖GetHashCode
和Equals
来定义自定义比较。
默认的相等比较器Default用于比较实现IEqualityComparer泛型接口的类型的值。要比较自定义数据类型,您需要实现此接口并为该类型提供自己的GetHashCode和Equals方法。
简而言之,如果要通过Id
属性比较实例,则需要将以下代码添加到类Assistence中。
public override int GetHashCode() {
return Id.GetHashCode();
}
public override bool Equals(obj otherInstance) {
return (otherInstance is Assistence) && ((Assistence)otherInstance).Id == Id;
}
如果您想在某些不唯一的字段上进行比较,请注意警告。请参阅this link。