我正在尝试计算两个列表之间的差异,我的列表类型有这样的结构:
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
的助理,还有一个列表包含了名为assistancesWithExpert
的expert
的助理,我需要计算assistanceWithoutExpert
。那么,在执行后,结果是AllAssitance
中的所有记录,为什么?
向致以最良好的问候
您需要使用带比较器的重载。对于复杂的类型,它不能开箱即用。
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();
使用默认的相等比较器进行比较。来自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;
}
不过,如果你想在一些不唯一的字段上进行比较,请注意警告。请参阅此链接。