Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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中按两个属性排序_Vb.net_Sorting - Fatal编程技术网

如何在Vb.Net中按两个属性排序

如何在Vb.Net中按两个属性排序,vb.net,sorting,Vb.net,Sorting,我希望排序时优先选择日期,但如果日期相同,我需要它位于或序列号的最低位置 Dim ListObj As New List(Of SomeObject) ListObj.OrderBy(Function(x) x.Date).ThenBy(Function(x) x.SequenceNumber) 输出: 2020/11/11 1 2020/11/09 3 2020/11/10 4 2020/11/10 5 2020/11/11 6 2020/11/09 6 期望: 2020/11/09

我希望排序时优先选择日期,但如果日期相同,我需要它位于或序列号的最低位置

 Dim ListObj As New List(Of SomeObject)
 ListObj.OrderBy(Function(x) x.Date).ThenBy(Function(x) x.SequenceNumber)
输出:

2020/11/11 1
2020/11/09 3
2020/11/10 4
2020/11/10 5
2020/11/11 6
2020/11/09 6
期望:

2020/11/09 3
2020/11/09 6
2020/11/10 4
2020/11/10 5
2020/11/11 1
2020/11/11 6

正如注释中所建议的,LINQ查询不会影响正在查询的原始列表。您不应该期望他们这样做,因为查询通常不会这样做。如果要按原样使用LINQ,则需要创建一个新的
列表(SomeObject)
,并替换现有列表:


ListObj=ListObj.OrderBy(函数(x)x.Date)。
然后是(函数(x)x.SequenceNumber)。
托利斯特()
一个潜在的问题是,对原始列表的任何其他引用都不受此影响。鉴于
List(Of T)
类有自己的
Sort
方法,可以对现有列表进行适当排序,因此不需要使用LINQ:

ListObj.Sort(函数(x,y)
Dim结果=x.Date.CompareTo(y.Date)
如果结果=0,则
结果=x.SequenceNumber。与(y.SequenceNumber)比较
如果结束
返回结果
终端功能)

Sort
重载需要一个
Comparison(of T)
委托来比较项目对,因此您可以编写一个Lambda或一个命名方法,以您喜欢的简单或复杂方式进行比较。上面的第二个片段基本上是LINQ在幕后的实现方式。

正如评论中所建议的,LINQ查询不会影响被查询的原始列表。您不应该期望他们这样做,因为查询通常不会这样做。如果要按原样使用LINQ,则需要创建一个新的
列表(SomeObject)
,并替换现有列表:


ListObj=ListObj.OrderBy(函数(x)x.Date)。
然后是(函数(x)x.SequenceNumber)。
托利斯特()
一个潜在的问题是,对原始列表的任何其他引用都不受此影响。鉴于
List(Of T)
类有自己的
Sort
方法,可以对现有列表进行适当排序,因此不需要使用LINQ:

ListObj.Sort(函数(x,y)
Dim结果=x.Date.CompareTo(y.Date)
如果结果=0,则
结果=x.SequenceNumber。与(y.SequenceNumber)比较
如果结束
返回结果
终端功能)

Sort
重载需要一个
Comparison(of T)
委托来比较项目对,因此您可以编写一个Lambda或一个命名方法,以您喜欢的简单或复杂方式进行比较。上面的第二个片段基本上是LINQ在幕后的实现方式。

请记住,所有LINQ运算符都返回一个新的
IEnumerable
,因此一定要将它指定给一个变量。否则,您将只使用原始的未排序列表。问题没有向我们显示
SomeObject
的定义。也许这就是问题所在。
.ToList()
ListObj=ListObj.OrderBy(函数(x)x.Date)。然后by(函数(x)x.SequenceNumber)。ToList()
您不必使用
ToList
,但您确实需要将结果分配给某个对象
OrderBy
ThenBy
不修改原始序列;它们返回一个新序列。显示的代码进行排序,然后丢弃结果。请记住,所有LINQ运算符都返回一个新的
IEnumerable
,因此请确保将其分配给变量。否则,您将只使用原始的未排序列表。问题没有向我们显示
SomeObject
的定义。也许这就是问题所在。
.ToList()
ListObj=ListObj.OrderBy(函数(x)x.Date)。然后by(函数(x)x.SequenceNumber)。ToList()
您不必使用
ToList
,但您确实需要将结果分配给某个对象
OrderBy
ThenBy
不修改原始序列;它们返回一个新序列。您显示的代码进行排序,然后丢弃结果。