比较两个列表的通用方法

时间:2017-07-19 15:27:16

标签: c# generics

我需要比较5套lists。要求是使用通用方法执行此操作。

例如,我列出了TeacherStudentTeacher标识为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#很新。

3 个答案:

答案 0 :(得分:2)

根据您的操作,您的类型应实现其中一个或两个接口:IEquitable如果您只想查看它们是否相同。 IComparable如果您想对实例进行排序/排序。

应该在类型上完成实现,因此StudentTeacher都将实现这些接口。如果您想比较StudentTeacher,您可以使用不同的通用参数(即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());