Что лучший способ состоит в том, чтобы отсортировать IList <T> в.Net 2.0?

Я не нашел правильного решения для этого, поэтому я использовал два механизма для достижения аналогичного эффекта:

  1. Сценарий сборки CI заменяет ссылку на Google CDN на локальный URL:
sed -i -e 's#https://storage[.]googleapis[.]com/workbox-cdn/releases/[0-9.]*/workbox-sw.js#/workbox/workbox-sw.js#g' build/service-worker.js
  1. , чтобы убедиться, что это никогда не будет обойдено, я также установил заголовки политики безопасности контента (а также метатеги, если приложение размещено где-то где заголовки не могут быть легко установлены), так что браузер знает, что мое приложение не может получить доступ к Google CDN (или что-нибудь еще на самом деле, за некоторыми исключениями, которые находятся под моим контролем).

Первая часть решения немного уродливая, и я все равно был бы заинтересован в лучшем способе, но это лучший метод, который я мог бы найти, не выбрасывая CRA.

5
задан Eddie Deyo 22 October 2008 в 18:23
поделиться

4 ответа

Из блога Paul Fox я рекомендую сообщение, "Как отсортировать IList": http://foxsys.blogspot.com/2007/06/how-to-sort-generic-ilist.html

На всякий случай тот блог уходит в будущем, я скопирую сообщение здесь:


Как отсортировать универсальный IList

Обновление

Можно читать и обновленное сообщение о сортировке универсального IList и Списка. Многие люди предпочтут методы, упомянутые в обновленном сообщении.

Сортировка универсального IList

Я пытался отсортировать универсальный IList <> и нашел довольно простой способ сделать его.

Шаг 1

Необходимо реализовать IComparable для типа, содержавшегося в IList. Для этого примера я собираюсь использовать простой Язык класс Dto.

public class LanguageDto : IComparable {
 private String name;
 public string Name { get { return name; } set { name = value; } }

 public LanguageDto(string name) {
     this.name = name;
 }

 #region IComparable Members
 public int CompareTo(object obj) {
     if (obj is LanguageDto) {
     LanguageDto language = (LanguageDto)obj;
     return this.name.CompareTo(language.name);
     }
     throw new ArgumentException(string.Format("Cannot compare a LanguageDto to an {0}", obj.GetType().ToString()));
 }
 #endregion
}

ШАГ 2

Отсортируйте свой IList. Чтобы сделать это, Вы будете использовать ArrayList. Адаптер () передача метода в Вашем IList и затем вызов Метода сортировки. Как так...

ArrayList.Adapter((IList)languages).Sort();

Примечание: языки имеют тип "IList"

Языки должны затем быть отсортированным списком Вашего типа!

13
ответ дан 18 December 2019 в 09:54
поделиться

Вы не можете бросить IList (T) к IList.

После некоторого сниффинга с Отражателем это походит на ArrayList. Адаптер (IList).Sort () сначала скопирует список в объектный массив, отсортирует массив и затем скопирует массив назад в список:

object[] array = new object[count];
this.CopyTo(index, array, 0, count);
Array.Sort(array, 0, count, comparer);
for (int i = 0; i < count; i++)
{
    this._list[i + index] = array[i];
}

Вы могли бы получить упаковку наверху если T в Вашем Списке (T) тип значения.

Если необходимо изменить последовательность объектов в списке, который Вы имеете, можно сделать это так же:

IList<object> unsorted = ...
List<object> sorted = new List<object>(unsorted);
sorted.Sort(); 
for (int i = 0; i < unsorted.Countt; i++)
{
    unsorted[i] = sorted[i];
}

Если список так огромен (как в сотнях миллиона объектов), что Вы не можете сделать дополнительную копию в памяти, я предлагаю использовать Список (T) во-первых или реализую Ваш любимый оперативный алгоритм сортировки.

6
ответ дан 18 December 2019 в 09:54
поделиться

Так как Метод сортировки не находится в интерфейсе IList, Вы могли бы рассмотреть создание Вашего собственного:

interface ISortableList<T> : IList<T>
{
    void Sort();
    void Sort(IComparer<T> comparer);
}

class SortableList<T> : List<T>, ISortableList<T> { }

/* usage */
void Example(ISortedList<T> list)
{
    list.Sort();
    list.Sort(new MyCustomerComparer());
}

В целом тип параметра, который Вы указываете в своем методе, должен быть наименьшим общим знаменателем участников, которых на самом деле необходимо позвонить. Если действительно необходимо назвать Вид () методом затем параметру нужно определить того участника. Иначе необходимо, вероятно, загрузить его в другой объект, который может сделать то, как что Вы хотите, такие:

void Example(IList<T> list)
{
    list = new List<T>(list).Sort();
}

Это должно на самом деле быть довольно быстро, почти наверняка быстрее все еще, чем запись Вашего собственного встроенного алгоритма сортировки.

1
ответ дан 18 December 2019 в 09:54
поделиться

Я знаю, что это не.NET 2.0, но я люблю LINQ так сильно и буду подтверждать его все шансы, которые я получаю :)

Простой вид:

var sortedProducts =
    from p in products
    orderby p.ProductName
    select p;

ObjectDumper.Write(sortedProducts);

Вид несколькими условиями:

string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };

var sortedDigits =
    from d in digits 
    orderby d.Length, d
    select d;

Оба примера от 101 Образца Linq

0
ответ дан 18 December 2019 в 09:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: