【发布时间】:2019-10-09 15:48:09
【问题描述】:
我正在尝试使用 IEqualityComparer 逐个字段比较 2 个集合中的 2 个字段。 IEqualityComparer 仅比较 1 个字段“名称”。我也想比较“mark”。
在Java中,我们有comparator接口来比较Equals方法中的多个字段。
using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
IList<Student> studentList1 = new List<Student>()
{
new Student(){ name="aaaaa", mark = 95, },
new Student(){ name="bbbb", mark = 25, },
new Student(){ name="ccc", mark = 80 }
};
IList<Student> studentList2 = new List<Student>()
{
new Student(){ name="aaaaa", mark = 95, },
new Student(){ name="bbbb", mark = 5, },
new Student(){ name="ccc", mark = 80 }
};
bool isEqual = studentList1.SequenceEqual(studentList2, new StudentComparer());
Console.WriteLine("Names in 2 collections are {0}", isEqual?"equal":"not equal");
}
}
public class Student
{
public string name { get; set; }
public int mark { get; set; }
}
public class StudentComparer : IEqualityComparer<Student>
{
public bool Equals(Student x, Student y)
{
if (x.name == y.name)
return true;
return false;
}
public int GetHashCode(Student obj)
{
return obj.GetHashCode();
}
}
实际结果: 2 个集合中的名称相等 预期结果: 2 个集合中的名称相等 2个集合中的分数不相等
【问题讨论】:
-
使用反射,比较这两个对象的每个属性,就知道每个属性的值是否相等..
-
为什么不在 equals 方法中添加标记比较呢?你怎么能期望一个控制台写行有 2 个输出?
-
Console.WriteLine("2 个集合中的标记为 {0}", isEqual?"equal":"not equal");我将添加这一行。此外,我还将添加标记比较。但我不确定如何在 Equals 方法中编写标记比较。 linq 查询如何区分名称和标记比较之间的差异。
-
if (x.name == y.name && x.mark == y.mark) 返回真; //这样我也可以实现2个字段的比较。有没有其他方法可以区分 linq 查询。 bool isNameEqual = studentList1.SequenceEqual(studentList2, new StudentComparer()); //使用这个我将打印名称是相等的。 bool isMarkEqual = studentList1.SequenceEqual(studentList2, new StudentComparer()); //使用这个我将打印标记不相等。
标签: c# linq iequalitycomparer