Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 排序可观察集合<;T>;不创建新列表_Vb.net_Observablecollection - Fatal编程技术网

Vb.net 排序可观察集合<;T>;不创建新列表

Vb.net 排序可观察集合<;T>;不创建新列表,vb.net,observablecollection,Vb.net,Observablecollection,我有一个ObservableCollection(Of T),我目前正试图找出一种排序列表的方法,而不必创建一个新的列表。我使用以下代码来实现这一点,ObservableCollection由Userprincipal信息组成 Dim SortedList2 = ChooseUserObservableCollection.OrderBy(Function(o) o.UserPrin.DisplayName).ThenBy(Function(o) o.UserPrin.Distinguished

我有一个ObservableCollection(Of T),我目前正试图找出一种排序列表的方法,而不必创建一个新的列表。我使用以下代码来实现这一点,ObservableCollection由Userprincipal信息组成

Dim SortedList2 = ChooseUserObservableCollection.OrderBy(Function(o) o.UserPrin.DisplayName).ThenBy(Function(o) o.UserPrin.DistinguishedName).ToList()
这很好,但是我必须创建一个新的变量,当我只想对列表进行排序时。此列表用作项目源,因此目标是不重新加载它

有人能告诉我一个更好的方法吗?

不要列出它;只要把它传给任何能列举它的人:

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

请记住,Linq查询将在枚举点运行,列表将被排序,而不是调用OrderBy的点。如果必须在调用后很快进行排序,那么您需要列出()它(或类似的)

我认为附加变量是最佳选择。在这个简单的例子中

dima={6,4,2,5,3,1}.OrderBy(函数(i)i Mod 2)。然后by(函数(i)i)
Console.WriteLine(a.First())
Console.WriteLine(a.Last())
a
将被枚举两次

可以通过对原始变量调用
ToList()
立即枚举它来防止这种情况

dima={6,4,2,5,3,1}.OrderBy(函数(i)i Mod 2).ThenBy(函数(i)i).ToList()
Console.WriteLine(a.First())
Console.WriteLine(a.Last())
或者使用第二个变量

dima={6,4,2,5,3,1}.OrderBy(函数(i)i Mod 2)。然后by(函数(i)i)
尺寸b=a.托利斯特()
Console.WriteLine(b.First())
Console.WriteLine(b.Last())
当然,对于第二个变量,稍后再次访问
a
可能会导致再次枚举它

如果查询非常耗时,那么您需要在应用程序中考虑一些我不太了解的因素。

旨在为源集合提供排序和筛选功能

您可以对其进行如下配置:

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
分配给UI控件的
itemsource
属性。

这似乎并不实际排序数据,至少在itemsource方面是这样。我将其设置为ICollectionView,然后允许它成为listbox的ITESSource。知道了这一点,我需要做些什么不同的事情吗?你是说当你点击列表()时它会排序,而当你不点击列表()时它不会排序?如果它从不排序,您应该问一个新问题,因为当前问题的范围不包括未能按您需要列举的顺序排序。ToList将保持枚举,并且不再枚举,除非您对其执行其他操作。它还将保持它的排序。@CaiusJard它排序,只是断开与项源的绑定。我将修改这个问题。