Сортировать ObservableCollection <T>без создания нового списка - PullRequest
0 голосов
/ 06 марта 2020

У меня есть ObservableCollection (Of T), и в настоящее время я пытаюсь найти способ сортировки списка без необходимости создания нового. Для этого я использую следующий код, ObservableCollection состоит из информации Userprincipal.

Dim SortedList2 = ChooseUserObservableCollection.OrderBy(Function(o) o.UserPrin.DisplayName).ThenBy(Function(o) o.UserPrin.DistinguishedName).ToList()

Это работает нормально, но мне снова нужно создать новую переменную, когда я просто хочу отсортировать список как есть. Этот список используется в качестве источника-элемента, поэтому целью не будет его перезагрузка.

Может кто-нибудь сообщить мне о лучшем подходе к этому?

Ответы [ 3 ]

0 голосов
/ 07 марта 2020

Я думаю, что дополнительная переменная - ваша лучшая ставка. В этом простом примере

Dim a = {6, 4, 2, 5, 3, 1}.OrderBy(Function(i) i Mod 2).ThenBy(Function(i) i)
Console.WriteLine(a.First())
Console.WriteLine(a.Last())

a будет перечислено дважды.

Вы можете предотвратить это, вызвав ToList() в исходной переменной, чтобы немедленно перечислить ее

Dim a = {6, 4, 2, 5, 3, 1}.OrderBy(Function(i) i Mod 2).ThenBy(Function(i) i).ToList()
Console.WriteLine(a.First())
Console.WriteLine(a.Last())

или с использованием второй переменной

Dim a = {6, 4, 2, 5, 3, 1}.OrderBy(Function(i) i Mod 2).ThenBy(Function(i) i)
Dim b = a.ToList()
Console.WriteLine(b.First())
Console.WriteLine(b.Last())

Конечно, при второй переменной повторный доступ к a позже может привести к его повторному перечислению.

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

0 голосов
/ 07 марта 2020

Класс CollectionViewSource предназначен для обеспечения возможностей сортировки и фильтрации для исходной коллекции.

Вы можете настроить его примерно так, как показано ниже:

Dim viewSource As New CollectionViewSource
Dim init As ComponentModel.ISupportInitialize = viewSource
init.BeginInit()
viewSource.View.SortDescriptions.Add((New ComponentModel.SortDescription("DisplayName", ComponentModel.ListSortDirection.Ascending)))
viewSource.View.SortDescriptions.Add((New ComponentModel.SortDescription("DistinguishedName", ComponentModel.ListSortDirection.Ascending)))
viewSource.Source = ChooseUserObservableCollection
init.EndInit()

Тогда вы бы присвоили CollectionViewSource .View свойству ItemsSource элемента управления вашего пользовательского интерфейса.

0 голосов
/ 06 марта 2020

Не списывать () это; просто передайте его тому, что будет его перечислять:

Return ChooseUserObservableCollection.OrderBy(Function(o) o.UserPrin.DisplayName).ThenBy(Function(o) o.UserPrin.DistinguishedName)  

Имейте в виду, что именно в точке перечисления будет выполняться запрос Linq и будет отсортирован список, а не точка, в которой OrderBy называется. Если это обязательно, чтобы упорядочение произошло очень скоро после его вызова, тогда вам нужно ToList () его (или аналогичный) ..

...