2013-08-30 2 views
3

мой первый пост здесь.Список WPF <t> сортировать

У меня есть список "<" frameworkelement>, который я заполняю процессом выбора. каждый элемент структуры имеет uid, который содержит ZOrder.

Мне нужно отсортировать их по ZOrder от низкого до высокого. я могу получить это с помощью ListBox и добавив Uid как это:

  //Add Object Uid's 
      ListBox lstTempOrder = new ListBox(); 
      foreach(FrameworkElement feObject in MainWindow.Data.SelectedObjects) 
      { 
       lstTempOrder.Items.Add(feObject.Uid); 
      } 
      //Reorder from 0 to above of the ZIndexes  
      lstTempOrder.Items.SortDescriptions.Add(new System.ComponentModel.SortDescription("", System.ComponentModel.ListSortDirection.Ascending)); 

, но мне нужно сделать это с помощью списка «<» FrameworkElement> и сортировка.

Вот код, где я заполнить список»< "T> (SelectedObjects и CopyObjectsCollections являются Список" < "FrameworkElement>" списки.

  foreach(FrameworkElement feObject in MainWindow.Data.SelectedObjects) 
      { 
       MainWindow.Data.CopyObjectsCollection.Add(feObject); 
      } 

Я посмотрел на CollectionViewSource и IComparer, но я могу «т действительно сделать любой смысл.

+1

Вместо того, чтобы делать это вручную, вы должны связать ваш ListBox к [CollectionViewSource] (HTTP: // msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.aspx), который позволяет сортировать элементы. См. [Связывание с коллекциями] (http://msdn.microsoft.com/en-us/library/ms752347.aspx#binding_to_collections) для примера. – Clemens

+0

Спасибо за ответ. Я не уверен, что вы подразумеваете, делая это вручную. Сортировка списка была просто для теста, и она работает, но я не могу решить, как сделать то же самое в списке «CopyObjectsCollection». Раньше я никогда не работал с привязкой. – Drew

+0

Связывание имеет важное значение в WPF. Вы можете начать читать статью [Обзор привязки данных] (http://msdn.microsoft.com/en-us/library/ms752347.aspx) в MSDN. – Clemens

ответ

1

я мог бы мисс прочитать ваш вопрос, но если вы просто хотите, чтобы отсортировать List<T>, то почему бы вам не просто использовать метод LinQOrderBy?

MainWindow.Data.CopyObjectsCollection = 
    MainWindow.Data.CopyObjectsCollection.OrderBy(f => f.Uid).ToList(); 

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

MainWindow.Data.CopyObjectsCollection = 
    MainWindow.Data.CopyObjectsCollection.OrderByDescending(f => f.Uid).ToList(); 

UPDATE >>>

OrderBy является методом LinQ расширения. Добавьте using System.Linq; в начало своего класса, чтобы использовать его. f относится к экземпляру вашего объекта FrameworkElement. Вышеупомянутое выражение лямбда в основном означает «сортировка с использованием значений свойств Uid».

UPDATE 2 >>>

Метод OrderBy делает не изменяет оригинальную коллекцию ... поэтому мой пример устанавливает коллекцию в результате метода OrderBy. Смотрите этот базовый пример:

List<FrameworkElement> elements = new List<FrameworkElement>(); 
elements.Add(new FrameworkElement() { Uid = "Object1003-1" }); 
elements.Add(new FrameworkElement() { Uid = "Object1002-2" }); 
elements.Add(new FrameworkElement() { Uid = "Object1002-1" }); 
elements.Add(new FrameworkElement() { Uid = "Object1001-1" }); 
elements.Add(new FrameworkElement() { Uid = "Object1001-3" }); 
elements.Add(new FrameworkElement() { Uid = "Object1001-2" }); 
string result = string.Join(", ", elements.Select(f => f.Uid)); 
elements = elements.OrderBy(f => f.Uid).ToList(); 
string orderedResult = string.Join(", ", elements.Select(f => f.Uid)); 

Сравнивая значения result и orderedResult вы можете видеть, что это заказывает их совершенно.

UPDATE 3 (и, надеюсь, последний) >>>

Чувак, вы должны узнать о лямбда-выражений ... посмотрим на Lambda Expressions (C# Programming Guide) страницу на MSDN для получения дополнительной информации.

elements = elements.OrderBy(f => f.Uid).ToList(); 

f в этом выражении лямбда объявляется в это выражение перед «=>».Это является довольно стандартным назвать эти параметры с одной буквы, как Exceptions, но мы могли имя это ничего:

elements = elements.OrderBy(frameworkElement => frameworkElement.Uid).ToList(); 
+0

Спасибо за ответ. он выглядит хорошо, но у моего List нет OrderBy. Я предполагаю, что «f» будет моим «feObject»? – Drew

+0

Пространство имен имело значение. я получаю не могу объявить для первого «F» «feObject» другое значение. Я объявил новый элемент структуры, который будет использоваться здесь, который скомпилирован, но список списка остается неизменным после foreach. Я попробовал его внутри и после. я уверен, что это я, потому что похоже, что он должен работать. спасибо за вашу помощь, я ценю это. Uid для каждого элемента подобен «Object1001-1» и «Object1002-2» и т. Д. – Drew

+0

, если я просто использую MainWindow.Data.CopyObjectsCollection.OrderBy (feObject => feObject.Uid) .ToList(); после цикла foreach это компилируется. не знаю, как я не объявляю feobject где-нибудь еще, но порядок все тот же. ничего не меняется. . – Drew

Смежные вопросы