如何对ArrayList的自定义元素进行排序?

如何对ArrayList的自定义元素进行排序?

ArrayList的自定义元素进行排序

ArrayList的Sort(IComparer)方法使用指定的比较器对整个 ArrayList 中的元素进行排序。向ArrayList中添加的自定义元素,当需要排序时,需要公开比较元素方法。

以下是一个例子。

先声明需要添加到ArrayList的自定义元素类型one:
public class One
{
public string N;
public int I;

public One(string n, int i)
{
N = n;
I = i;
}
}

公开比较元素方法:
ArrayList 比较元素时要使用 IComparer 实现。以下是三个比较器

比较器oneIComparer1实现比较两个One(按照One.N的升序排列)
public class oneIComparer1 : IComparer
{
int IComparer.Compare( Object x, Object y )
{
return string.Compare(((One)x).N,((One)y).N);
}
}

比较器oneIComparer2实现比较两个One(按照One.N的降序排列)
public class oneIComparer2 : IComparer
{
int IComparer.Compare( Object x, Object y )
{
return string.Compare(((one)y).N,((one)x).N);
}
}

比较器oneIComparer3实现比较两个One(按照One.I的升序排列)
public class oneIComparer3 : IComparer
{
int IComparer.Compare( Object x, Object y )
{
return ((One)x).I.CompareTo(((One)y).I);
}
}

ArrayList list = new ArrayList();

//向list添加三个类型为One的元素
list.Add(new One("a1",999));
list.Add(new One("a2",998));
list.Add(new One("a3",997));


//创建自定义比较器comparer1
comparer1 = new oneIComparer1();
//按照自定义比较器comparer1对list中的元素排序(升序排列)
list.Sort(comparer1);
//使用比较器comparer1在整个已排序的 list 中搜索One.N的值为"a3"的元素从零开始的索引。
list.BinarySearch(new One("a3",0),comparer1) 的值为2

//按照One.N的降序排列后搜索One.N的值为"a3"的元素从零开始的索引。
comparer2 = new oneIComparer2();
list.Sort(comparer2);
list.BinarySearch(new One("a3",0),comparer2) 的值为0

//搜索One.I的值为997的元素从零开始的索引。
comparer3 = new oneIComparer3();
list.Sort(comparer3);
list.BinarySearch(new One("",997),comparer3) 的值为0

为了代码更加清晰,并容易理解,可以给One添加一个构造函数
public One(string n)
{
N = n;
}

list.BinarySearch(new One("a3",0),comparer1)可改为:
list.BinarySearch(new One("a3"),comparer1)