我有一项作业,必须通过其属性之一比较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
基类也许会更好。
另外,由于您只使用专业的列表,因此可以将通用列表参数限制为IMajorInterface
或Major
基类本身。那将是最简单(也是最不灵活)的解决方案:
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] 删除。
我来说两句