我有一个看起来像这样的对象:
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)
,其中每个键都有一些值。。。如果对它们进行排序,则会有一系列相互跟随的关键点,但每个关键点之间的差异可能大于1。现在我得到了这个列表的一个子集,我想(在按键排序后)检查每个MyObject.Key
之间的差是否不大于1,然后得到这个子集。
最好的方法是什么?
您可以使用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}=>14-11=4-1)。
不知道这是否是最好的解决方案,但您可以使用聚合函数:
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,则它们不是连续的,否则它们是连续的。