考虑创建一个进行比较的Comparer 方法。
例如,创建一个使用两个字段的比较器:(这是在 C# 中,因为我的 VB 有点生疏):
class MyCustomComparer: Comparer<MyObject>
{
public override int Compare(MyObject obj1, MyObject obj2)
{
int rslt = obj1.field1.CompareTo(obj2.field1);
if (rslt != 0)
{
rslt = obj1.field2.CompareTo(obj2.field2);
}
return rslt;
}
}
然后您可以创建其中一个对象并将其传递给采用比较函数的List.Sort 重载。
当用户可以指定字段和排序顺序时,事情会变得有点复杂。我在pase中所做的是为每个可以比较的字段创建一个方法,例如:
private int CompareField1(MyObject obj1, MyObject obj2)
{
return obj1.field1.CompareTo(obj2.field1);
}
private int CompareField2(MyObject obj1, MyObject obj2)
{
return obj1.field2.CompareTo(obj2.field2);
}
然后我在构造函数中创建了一个函数引用列表,一个用于用户指定的每个字段。它看起来像这样:
private List<Func<MyObject, MyObject, int>> compares;
public MyCustomComparer(List<int> fieldsToCompare)
{
compares = new List<Func<MyObject, MyObject, int>>();
for (int i = 0; i < fieldsToCompare.Count; ++i)
{
switch (fieldsToCompare[i])
{
case 1: compares.Add(CompareField1); break;
case 2: compares.Add(CompareField2); break;
// other fields here
}
}
}
然后,您的 CompareTo 方法循环通过 compares 列表:
public override int Compare(MyObject obj1, MyObject obj2)
{
for (int i = 0; i < compares.Count; ++i)
{
int rslt = compares[i](obj1, obj2);
if (rslt != 0) return rslt;
}
return 0;
}
它不是特别漂亮,但它很有效。