0
IList<A_Desc,A_premium,B_Desc,B_Premium>

我可以根据 A_Desc 对两列 A_Desc,A_premium... 进行排序吗?

并让 B_Desc,B_Premium 在排序前保持相同的顺序

4

1 回答 1

0

首先,列表只能是一种类型,并且只有一个“列”数据,因此您实际上需要两个列表和一个包含“desc”和“premium”的数据类型。“desc”对我来说听起来像一个字符串;我不知道 Premium 是什么,但我会假装它是double因为缺乏更好的想法。我不知道这些数据应该代表什么,所以对我来说,这只是一些东西。

public class Thingie{
    public String desc;
    public double premium;
}

当然,这是定义类的一种糟糕方法——我应该将 desc 和 premium 设为私有,而 Desc 和 Premium 作为公共属性,并带有 Get 和 Set 方法。但这是我理解这一点的最快方法。

让 Thingie 实现 IComparable 并将其自身与其他 Thingie 对象进行比较更为规范。但是我正在编辑我在知道您需要编写自定义类型之前写的答案,并且可以自由地使其实现 IComparable。所以这里是 IComparer 方法,它允许您通过告诉 C# 如何对它们进行排序来对不排序的对象进行排序。

实现一个对您的自定义类型进行操作的 IComparer。

public class ThingieSorter: IComparer<Thingie>{
    public int Compare(Thingie t1, Thingie t2){
        int r = t1.desc.CompareTo(t2);
        if(r != 0){return r;}
        return t1.premium.CompareTo(t2);
    }
}

C# 不需要 IList 来实现 Sort - 如果它是 LinkedList,它可能效率低下。所以让我们创建一个基于数组的新列表,它确实有效地排序,并对其进行排序:

public List<Thingie> sortedOf(IList<Thingie> list){
    List<Thingie> ret = new List<Thingie>(list);
    ret.sort(new ThingieSorter());
    return ret;
}

List<Thingie>实现了接口IList<Thingie>,所以用这个替换你的原始列表不应该破坏任何东西,只要你没有保留原始列表并神奇地期望它被排序。如果发生这种情况,请重构您的代码,使其在您的列表被排序之前不会获取引用,因为它无法就地排序。

于 2010-12-03T18:53:45.163 回答