Можем ли мы частично отсортировать IList? - PullRequest
0 голосов
/ 03 декабря 2010
IList<A_Desc,A_premium,B_Desc,B_Premium>

Можно ли отсортировать два столбца A_Desc, A_premium ... на основе A_Desc?

И пусть B_Desc, B_Premium остаются в том же порядке перед сортировкой

1 Ответ

0 голосов
/ 03 декабря 2010

Во-первых, список может быть только одного типа и иметь только один «столбец» данных, поэтому вам действительно нужны два списка и тип данных, который содержит «desc» и «premium».«desc» для меня звучит как String;Я не знаю, что такое Премиум, но я притворюсь, что это 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 для реализации сортировки - это может быть неэффективно, если это 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>, поэтому замена исходного списка этим не должнаразбить что-нибудь, пока вы ничего не держите в исходном списке и волшебным образом не ожидаете, что он будет отсортирован.Если это происходит, реорганизуйте свой код, чтобы он не захватывал ссылку до тех пор, пока ваш список не будет отсортирован, поскольку он не может быть отсортирован по месту.

...