我需要比较5套lists
。要求是使用通用方法执行此操作。
例如,我列出了Teacher
和Student
。 Teacher
标识为TeacherId
,而Student
标记为StudentId
。是否可以创建一个可以接受的方法:
var result = Compare (teacherA, teacherB, "TeacherId");
var result = Compare (studentA, studentB, "StudentId");
这可能类似于最常见的答案:How can I create a generic method to compare two list of any type. The type may be a List of class as well
但这是否意味着我必须为每个IComparable
类型创建5个list
方法?对不起,我对C#很新。
答案 0 :(得分:2)
根据您的操作,您的类型应实现其中一个或两个接口:IEquitable如果您只想查看它们是否相同。 IComparable如果您想对实例进行排序/排序。
应该在类型上完成实现,因此Student
和Teacher
都将实现这些接口。如果您想比较Student
和Teacher
,您可以使用不同的通用参数(即class Student : IEquitable<Student>, IEquitable<Teacher>
)实现相同的接口
此处无需使用泛型。
答案 1 :(得分:0)
看起来你有非常相似的类,你可以创建一个像Person这样的基类,例如,使用属性Id,然后在继承的类中覆盖它。之后,您可以比较ID。
public class Person
{
public virtual string Id { get; set; }
// ...
}
public class Student : Person
{
public override string Id { get; set; }
// ...
}
// ...
答案 2 :(得分:0)
您应该使用接口。
interface ICompareById {
int Id { get; }
}
class Student : ICompareById {
int Id { get; set; }
int StudentId { get { return this.Id; }
}
class Teacher : ICompareById {
int Id { get; set; }
int TeacherId { get { return this.Id; }
}
class IdComp : IComparer<ICompareById>
{
int Compare(ICompareById x, ICompareById y)
{
return Comparer<int>.Default.Compare(x.Id, y.Id);
}
}
寻找共同元素:
teacherList.Intersect(studentList, new IdComp());