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

直弯

我有一项作业,必须通过其属性之一比较2个对象,但是由于我正在使用链表上的泛型类型来存储对象,因此我无法真正访问该对象的特定属性(我m使用一个接口,并且所有类都实现了该接口)所以我有了一个主要接口,还有一些类(例如class1,class2)继承了接口属性,例如Age或任何可比较的数字。在Main()中,我刚刚创建了一个新的LinkedList并创建了一些class1,class2对象。我使用SortedListAddElement方法将它们放置在有序列表中,但是我被困在应该通过int属性比较元素的部分。我应该如何继续使用此源代码?我应该将第一行更改为:类列表: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;
            }
        }
    }
伦德罗

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

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

然后在列表类实现中约束您的通用类型参数:

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

然后IComparable在具体的主要类(class1,class2)中实现该接口。可能建议为这些对象实现一个基类,在此实现接口并从该基类派生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

希望对您有所帮助。祝您编码愉快!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C# 泛型对象不能添加到该泛型类型的列表中

来自分类Dev

C#中泛型类型的缺点

来自分类Dev

C#中的泛型类型

来自分类Dev

在C#中循环泛型类型

来自分类Dev

C#中的泛型类型转换

来自分类Dev

C#中的双重泛型类型

来自分类Dev

如何在JAVA泛型中定义使用2个泛型参数扩展Map对象的类型?

来自分类Dev

类中具有2个泛型类型的方法,其中1个泛型类型

来自分类Dev

类中具有2个泛型类型的方法,其中1个泛型类型

来自分类Dev

与Xcode 10.2中的泛型类型比较

来自分类Dev

在C#中的函数中访问泛型类型的属性

来自分类Dev

将C#泛型用于特定类型支持而无需硬编码类型比较

来自分类Dev

C#中的条件泛型类型构造函数?

来自分类Dev

在C#中访问非泛型类型

来自分类Dev

C#中的泛型和继承类型

来自分类Dev

返回C#中作为集合的泛型类型

来自分类Dev

C#中的递归泛型类型参数

来自分类Dev

在c#中遍历泛型类型列表

来自分类Dev

在C#中强制转换为任何类型的泛型

来自分类Dev

C#泛型类型中的多态性

来自分类Dev

在 C# 中安全地转换泛型类型

来自分类Dev

如何在C#中从泛型创建对象

来自分类Dev

C#转换为接口泛型中的对象

来自分类Dev

如何在C#中从泛型创建对象

来自分类Dev

C#转换为接口泛型中的对象

来自分类Dev

C#泛型并使用类型化方法中的非泛型版本

来自分类Dev

在C#中检查T泛型类型具有属性S(泛型)

来自分类Dev

c#获取泛型类中泛型类型参数的名称

来自分类Dev

如何在C#中的泛型类中使用泛型类的对象?