Сортировка пользовательских объектов с параметром в .NET? - PullRequest
0 голосов
/ 15 июня 2010

Допустим, у меня есть пользовательский объект Foo

Есть ли в любом случае, я могу отсортировать список этих объектов, как

list<of foo>.sort()

, а также иметь возможность сортировать этот список с помощью передаваемого параметра. что повлияет на сорт?

list<of foo>.sort(pValue)

Полагаю, мне нужно определить два отдельных вида, но я не уверен.

РЕДАКТИРОВАТЬ: используя встроенный список. Способ сортировки объектов зависит от того, передан ли параметр. Я мог бы использовать глобальную переменную и использовать ее для сортировки, но это делает плохой bac код: p

Ответы [ 7 ]

2 голосов
/ 15 июня 2010

Вы должны попробовать

list<of foo>.OrderBy( .... )

, где внутри OrderBy вы можете использовать лямбда-выражения для управления алгоритмом сортировки по параметрам и порядку сортировки

2 голосов
/ 15 июня 2010

Если вы определяете метод Sort(), тогда да.

Достаточно просто перегрузить метод Sort () в C # (или использовать необязательный параметр в VB.NET).

Если вы говорите о List.Sort(), который запекается в фреймворке ... тогда я не уверен, что вы хотите сделать, и вам нужно будет предоставить более подробную информацию.

1 голос
/ 15 июня 2010

Это довольно легко в C #.Просто создайте лямбда-функции для обоих, и вы можете указать параметр прямо в лямбда-функции.Я знаю, что VB поддерживает методы расширения, но я не уверен насчет лямбда-функций.

// Sorting ints based on natural order:
List<Int32> ints = GetInts();
ints.Sort((lhs, rhs) => lhs.Compare(rhs));

// Sorting Foo objects based on some computation:
List<Foo> foos = GetFoos();
foos.Sort((lhs, rhs) => lhs.Compute(pValue).Compare(rhs.Compute(pValue)));
1 голос
/ 15 июня 2010

Взгляните на IComparer и IComparable

0 голосов
/ 15 июня 2010

Как уже было сказано, вы должны взглянуть на реализацию интерфейса IComparable на вашем объекте.Затем вы можете создать новый класс, реализующий IComparer , который будет использоваться для управления сортировкой, которую вы хотите применить.Есть пара хороших статей здесь и здесь , которые должны помочь вам начать.

0 голосов
/ 15 июня 2010

У вас есть три варианта:

  • Сортируемый класс может реализовать IComparable
  • Вы можете реализовать IComparer<of foo> и использовать его экземпляр при вызове sort().
  • Вы можете создать функцию, которая сравнивает два объекта foo, и использовать эту функцию при вызове sort().

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

Делегат проще в использовании, но немного менее чистый, если вы хотите параметризовать сравнение.

0 голосов
/ 15 июня 2010

объявление (как метод расширения):

public static void Sort(this List<Foo> list, Bar param)
{
   // your sorting algorithm
}

использование:

var list = new List<Foo>();
list.Add(new Foo());
list.Sort(); // standard algorithm
list.Sort(new Bar()); // your own algorithm
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...