我需要明确地实现标准c#接口,例如(IComparable
,IComparer
,IEquatable
,IEnumerable
,IEnumerator
)。我做得对吗?
class Lemon : IComparable
{
public String name { get; set; }
public int id { get; set; }
public Lemon (String name, int id)
{
this.name = name;
this.id = id;
}
int IComparable.CompareTo(object obj)
{
Lemon other = (Lemon)obj;
if (this.id > other.id)
return 1;
else if (this.id < other.id)
return -1;
else return 0;
}
public void diamond ()
{
Console.WriteLine();
}
public override string ToString()
{
return this.name + " " + this.id;
}
}
现在主要:
static void Main(string[] args)
{
List<IComparable> icL = new List<IComparable>();
IComparable temp = new Lemon("Git", 99);
icL.Add(temp);
icL.Add(new Lemon("Green", 9));
icL.Add(new Lemon("Don", 7));
icL.Add(new Lemon("Simon", 12));
icL.Sort();
foreach (IComparable itm in icL)
{
Console.WriteLine(itm.ToString());
}
Console.WriteLine("----------");
}
那你觉得怎么样?
另一个问题是我在迭代集合时如何访问方法菱形?
答案 0 :(得分:1)
对此没有单一答案;但 对于与实现IComparable<T>
相当的类型非常有用。这通常是共享单个实现的情况:
int IComparable<Lemon>.CompareTo(Lemon obj) {
return CompareTo(obj);
}
int IComparable.CompareTo(object obj) {
return CompareTo(obj as Lemon);
}
private int CompareTo(Lemon obj) {
return obj == null ? -1 : (this.id - obj.id);
}
请注意,实现IEnumerable
/ IEnumerator
非常不同,通常只需返回封装对象的迭代器,或者编写迭代器块;从头开始手动编写迭代器是非常罕见的。
如果您实施IEquatable<T>
,则应确保object.Equals
,object.GetHashCode
和IEquatable<T>.Equals
都具有匹配的实施方式;对于2个Equals
方法,可以通过使用从两个方法调用的单个方法再次完成此操作。
您的列表可能是List<Lemon>
;它应该仍然正确排序。这样也可以轻松访问diamond()
:
var icL = new List<Lemon>();
// ...
foreach (var item in icL) {
item.diamond();
Console.WriteLine(item.ToString());
}