比较C#中2个泛型类的对象

时间:2014-04-27 23:35:35

标签: c# generics

我有一个家庭作业,我必须通过他们的一个属性来比较2个对象,但是因为我在链接列表中使用泛型类型,我必须存储对象,我可以&#39 ; t真正达到对象的某些属性(我使用的是接口,所有类都实现了该接口) 所以我有一个主要的接口,以及一些继承接口属性(如Age)的类(即class1,class2),或者任何类型的数字都可以轻松比较。在Main()中,我刚刚创建了一个新的LinkedList并创建了一些class1,class2对象。我将它们放在带有SortedListAddElement方法的有序列表中,但是我仍然坚持应该通过int属性来比较元素。我应该如何使用此源代码继续?我应该将第一行更改为:class List:IEnumerable,IComparable,IMajorInterface?或者在CompareTo()中改变一些东西?请帮忙!

interface IMajorInterface 
{ 
    string Name{ get; } 
    int Age { get; set; } 
}

class List<T> : IEnumerable<T>, IComparable<T>
{
    ListElement<T> head;

    public List()
    {
        head = null;
    }

    public void SortedListAddElement(T newValue)
    {
        ListElement<T> new = new ListElement<T>(newValue);
        ListElement<T> p = head;
        ListElement<T> e = null;
        while (p != null /* && this is the part where I should compare the p and new objects by their property, for example the Age property, like: p.Age < new.Age */)
        {
            e = p;
            p = p.Next;
        }
        if (e == null)
        {
            new.Next = head;
            head = new;
        }
        else
        {
            new.Next = p;
            e.Next = new;
        }
    }

    public int CompareTo(T obj)
    {
        if (obj == null)
        {
            return -1;
        }
        else
        {
            if (obj is T)
            {
                T obj2 = obj as T;
                return obj.Age.CompareTo(obj2.Age);
            }
            else
            {
                return -1;
            }
        }
    }

3 个答案:

答案 0 :(得分:4)

有几种方法可以解决这个问题。这是一种方法。首先,使您的主要界面具有可比性:

interface IMajorInterface : IComparable<IMajorInterface>
{
    string Name{ get; }
    int Age { get; set; }
}

然后在列表类实现中约束泛型类型参数:

class List<T> : IEnumerable<T>
    where T : IComparable<T>
{
    // ... Code omitted for brevity.
}

然后在具体的主要类(class1,class2)中实现IComparable接口。也许建议为那些实现基类,在那里实现接口并从该基类派生class1和class2等。也许最好完全删除IMajorInterface并创建一个抽象的Major基类。

或者,由于您只使用专业列表,您可以将通用列表参数约束到IMajorInterfaceMajor基类本身。这将是最简单(也是最不灵活)的解决方案:

class List<T> : IEnumerable<T>
    where T : IMajorInterface // No need to implement IComparable<T> in any class.
{
    // ... Code omitted for brevity.
}

最后,作为另一种方法,您可以在其构造函数的列表中提供IComparer<T>,就像System.Collections.Generic类一样。调查MSDN

我希望它有所帮助。快乐的编码!

答案 1 :(得分:3)

你可以实现IComparer。

class ageComparer : IComparer<Person>
   {
        public int Compare(Person x, Person y)
        {
            return x.Age - y.Age;
        }
   }

查看这篇文章http://www.blackwasp.co.uk/IComparer_2.aspx

答案 2 :(得分:1)

这是c-sharpcorner上一篇比较泛型类型的文章:

http://www.c-sharpcorner.com/UploadFile/1a81c5/compare-2-objects-of-generic-class-type-in-C-Sharp/

快速代码段:

 static bool Compare<T>(T Object1, T object2)
 {
      //Get the type of the object
      Type type = typeof(T);

      //return false if any of the object is false
      if (Object1 == null || object2 == null)
         return false;

     //Loop through each properties inside class and get values for the property from both the objects and compare
     foreach (System.Reflection.PropertyInfo property in type.GetProperties())
     {
          if (property.Name != "ExtensionData")
          {
              string Object1Value = string.Empty;
              string Object2Value = string.Empty;
              if (type.GetProperty(property.Name).GetValue(Object1, null) != null)
                    Object1Value = type.GetProperty(property.Name).GetValue(Object1, null).ToString();
              if (type.GetProperty(property.Name).GetValue(object2, null) != null)
                    Object2Value = type.GetProperty(property.Name).GetValue(object2, null).ToString();
              if (Object1Value.Trim() != Object2Value.Trim())
              {
                  return false;
              }
          }
     }
     return true;
 }