Проверьте, следуют ли объекты последовательно, используя LINQ - PullRequest
1 голос
/ 27 мая 2011

У меня есть объект, который выглядит следующим образом:

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, и получить этоподмножество.

Каков наилучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 27 мая 2011

Вы можете использовать этот трюк с 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).

0 голосов
/ 27 мая 2011

Не знаю, будет ли это лучшим решением, но вы можете использовать функцию агрегирования:

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, то они не последовательные, иначе они есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...