создайте сортировку, а затем извлеките первый n метод для списка , где T: сопоставимый

#c#

#c#

Вопрос:

Я хочу написать универсальный метод со следующей подписью :

 IList<T> Sort<T> (IList<T> list) where T: IComparable <T> 
  

это возвращает отсортированный список.
извините за неполный исходный пост.
итак, я хочу отсортировать список, а затем выбрать первые n элементов
, которые будут

         List<T> temp = new List<T>(list);
        temp.Sort();
        List<T> temp2 = new List<T>(temp);
        temp2.Take(count);
  

полный вопрос будет заключаться в том, как это сделать без двойного копирования исходного списка.
было бы 2 случая :
в списке есть дубликаты, и я хочу получить первые n различных значений
в списке есть дубликаты, и я хочу получить первые n значений.
для первого случая также следует применять distinct, поэтому следует избегать новой «третьей» копии списка.

конечно, ответ, опубликованный guffa, принимается, потому что сначала OP был неполным.

Комментарии:

1. Вы хотите отсортировать на месте или создать новый список?

2. В любом экземпляре IList уже есть метод Sort() (через IEnumerable и System.Linq)

3. @SLasks: только судя по сигнатуре метода, метод должен возвращать новый список и оставлять исходный нетронутым.

4. @Joel Coehoorn: Вы имеете в виду OrderBy метод?

5. @Guffa Ммм … да. Упс

Ответ №1:

Создайте новый List<T> из входных данных и отсортируйте его:

 public IList<T> Sort<T> (IList<T> list) where T: IComparable <T> {
  List<T> temp = new List<T>(list);
  temp.Sort();
  return temp;
}
  

Sort Метод будет использовать средство сравнения по умолчанию, если вы его не укажете, которое использует IComparable<T> реализацию, если она есть.

Редактировать:

Чтобы ответить на отредактированный вопрос:

Вам нужно скопировать список дважды, если вы хотите сохранить входные данные и вернуть список.

Вы могли бы обойти второе копирование, если вернетесь IEnumerable<T> вместо IList<T> . Затем вы можете вернуть отложенный результат, который считывается из первой копии списка. Недостатком, конечно, является то, что он сохранит весь первый список в памяти, хотя вы используете только его часть.

В любом случае, версия, возвращающая an IList<T> , будет выглядеть примерно так:

 public IList<T> Sort<T> (IList<T> list, int cnt, bool distinct) where T: IComparable <T> {
  IEnumerable<T> temp = list.OrderBy(t => t);
  if (distinct) {
    temp = temp.Distinct();
  }
  return temp.Take(cnt).ToList();
}
  

Для версии, возвращающей an IEnumerable<T> , вы просто не сделали .ToList() бы на последнем шаге.