我们可以部分地对IList进行排序吗?

时间:2010-12-03 18:37:18

标签: sorting ilist

IList<A_Desc,A_premium,B_Desc,B_Premium>

我可以根据A_Desc排序两列A_Desc,A_premium ......

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

1 个答案:

答案 0 :(得分: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>,因此用这个替换原始列表不应该破坏任何东西,只要你没有任何东西保留在原始列表上并且神奇地期望它被排序。如果发生这种情况,请重构您的代码,以便在您的列表排序后才会获取引用,因为它无法进行排序。