#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()
бы на последнем шаге.