如何在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
不修改原始序列;它们返回一个新序列。您显示的代码进行排序,然后丢弃结果。