使用LINQ检查对象是否按顺序执行

时间:2011-05-27 09:07:21

标签: vb.net linq sorting

我有一个看起来像这样的对象:

Public Class MyObject

Public Property Key as Intger
get 'Elided for clarity
set
End Property

Public Property Value as String
get
set
End Property

Private key as Intger
Private value as String

End Class

然后我有List(Of MyObject)其中每个Key都有一些价值......如果你对它们进行排序,你会有一系列相互跟随的键,但每个键之间的差异可能是> 1.现在我得到了这个列表的一个子集,我希望(按Key排序后)检查每个MyObject.Key之间的差异是否大于1并得到这个子集。

最好的方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用Zip和Skip来获取差异,然后测试它们:

Dim differences = subset.Zip(subset.Skip(1), Function(a,b) b.Key - a.Key)
Dim valid = differences.All(Function(x) x <= 1)

基本上,这会将一个序列与自身对齐,然后向前移动一个元素,并计算差异。请注意,这会评估subset两次。它可能重要也可能不重要。

如果密钥是唯一的,您可以更轻松地完成此操作:

Dim valid = (subset.Last() - subset.First() = subset.Count() - 1)

这是有效的,因为知道它们是有序的,唯一的,并且它们的差异不大于1,那么键必须按顺序排列。因此,键的数量比最后一个和第一个之间的差异多一个(例如{11,12,13,14} =&gt; 14-11 = 4-1)。

答案 1 :(得分:0)

不知道它是否是最佳解决方案,但您可以使用聚合函数:

Dim blah = theList.Aggregate(0, Function(aggregator, aggragate)
                                    If aggregator >= 0 AndAlso aggragate.Key = aggregator + 1 Then
                                        Return aggragate.Key
                                    Else
                                        Return -1
                                    End If
                                End Function)

如果它返回-1则它们不是顺序的,否则它们是。