C # Список Порядок по проблеме - PullRequest
2 голосов
/ 08 августа 2011

Я работаю с WPF и столкнулся с проблемой сортировки в списке.Я нахожу пример, что он использует OrderBy (T => T. [поле, которое ссылается на него для сортировки]), например,

List<Contact> contacts = new List<Contact>();
contacts.OrderBy(Contact => Contact.PhoneNumber)

Это прекрасно работает.

Однако, если я наденуНе знаю тип и даже не знаю поля в этом типе, как мне реализовать функцию сортировки?

Как: что я должен вставить в OrderBy (??? => ????. ?????)

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

Большое спасибо!

Ответы [ 4 ]

2 голосов
/ 08 августа 2011

Есть два варианта.

  1. Используйте отражение для сбора открытых свойств, по которым можно отсортировать, или
  2. Используйте классы (хорошим примером будет DataTable), которые позволяют вам получать доступ к значениям через индекс, т.е.contacts.OrderBy (Contact => Contact [3])

Также см. c # свойства в качестве обозначения массива .

Вариант 1 расширен:

Получение массива открытых свойств кажется хорошим выбором и довольно прост:

var propertyInfos = typeof(MyClass).GetProperties(BindingFlags.Public | BindingFlags.Instance);

Полученный массив можно использовать для заполнения столбцов вашего gridView и использовать для сортировки:

contacts.OrderBy(Contact => propertyInfos[0].GetValue(Contact, null));
1 голос
/ 08 августа 2011

Два решения для динамической сортировки ...

  1. Для ItemsSource GridView задано значение ICollectionView или ListCollectionView с SourceCollection, заданным в качестве собственного списка и имеющим SortDescription где PropertyName может быть указано как строковое значение ... http://marlongrech.wordpress.com/2008/11/22/icollectionview-explained/

  2. Динамический LINQ с MyList.AsQueryable().OrderBy(<OrderByClause>), где можно упорядочить предложение order by динамически ... Как применить OrderByна IQueryable, используя имя столбца строки в общем методе расширения?

Так что, когда пользователь нажимает на заголовки столбцов вида сетки, вы должны извлечь имя свойства, которое столбецпредставляет и использует любой из двух вышеуказанных подходов.В варианте 2 вам необходимо установить ItemsSource после сортировки коллекции.

Любой из двух подходов может быть реализован в приложении Attached Behavior, которое работает с GridView, чтобы иметь общее решение.

<ListView myNameSpace:ListSortingBehavior.SortingSource="CollectionView" ... /> <!-- CollectionView SortDescriptions -->

ИЛИ

<ListView myNameSpace:ListSortingBehavior.SortingSource="Generic" ... /> <!-- AsQueryable LINQ -->

Все, что вам нужно беспокоиться об этом, если вы используете option1, тогда вы должны были бы предположить, что GridView.ItemsSource всегда будет ICollectionView.При втором подходе компромисс заключается в том, что вам придется «устанавливать» ItemsSource после сортировки.

Надеюсь, это поможет ...

1 голос
/ 08 августа 2011

, если вы хотите отсортировать сетку данных, просмотр списка, список и т. Д.Вы должны попробовать ICollectionView.Можете ли вы дать больше информации о том, что вы хотите.

0 голосов
/ 08 августа 2011

Вы можете использовать enum для некоторых типов сортировки

Как

Sort.name
Sort.phone
Sort.adress

, и сортировка будет только с буквами и цифрами и desc или asc

hopeу меня есть помощь

...