2011-05-27 58 views
1

我有一個對象,看起來像這樣:檢查對象有順序使用LINQ

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

您可以使用這一招用郵和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)。

+0

b沒有我的對象的屬性?似乎它沒有把它看作是MyObject類型的對象。 – 2011-05-27 10:00:35

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,那麼他們不是連續的,否則他們。