2013-07-23 4 views
2

Если есть два списка:Проверьте два списка, по крайней мере, один общий пункт

Dim list1 As New List(Of Integer) 
list1.AddRange({1, 2, 3}) 

Dim list2 As New List(Of Integer) 
list2.AddRange({1, 4, 5}) 

Что является лучшим способом в VB.NET, с точки зрения производительности, чтобы обнаружить, есть ли они один или более общий Предметы? Насколько это возможно, это должно быть общим.

ответ

2
<System.Runtime.CompilerServices.Extension()> _ 
Function ContainsAny(Of T)(col1 As IEnumerable(Of T), col2 As IEnumerable(Of T)) As Boolean 
    ' performance checks 
    If col1 Is Nothing OrElse col2 Is Nothing Then Return False 
    If col1 Is col2 Then Return True 
    ' compare items, using the smallest collection 
    If col1.Count < col2.Count Then 
     Dim hs1 As New HashSet(Of T)(col1) 
     For Each v In col2 
      If hs1.Contains(v) Then Return True 
     Next 
    Else 
     Dim hs2 As New HashSet(Of T)(col2) 
     For Each v In col1 
      If hs2.Contains(v) Then Return True 
     Next 
    End If 
    Return False 
End Function 

Пример кода:

Dim list1 As New List(Of Integer) 
list1.AddRange({1, 2, 3}) 

Dim list2 As New List(Of Integer) 
list2.AddRange({1, 4, 5}) 

Dim anyMatch As Boolean = list1.ContainsAny(list2) 
+0

С как содержит работы, IIRC, он будет перебирать все элементы, чтобы найти вам нужно, что очень медленно. Лучший способ, по моему мнению, состоял бы в том, чтобы повторить и поставить значения в Hashset или Dictionary (в зависимости от используемой версии .NET), затем используйте [Contains] (http://msdn.microsoft.com/en-us /library/bb356440.aspx) или [ContainsKey] (http://msdn.microsoft.com/en-us/library/kw5aaea4.aspx) соответственно. – Neolisk

+0

хороший улов, обновленная функция, лучше сейчас? – jor

+0

Да, как я могу принять ваш ответ? Шутка, +1. :) – Neolisk

1

В C# (но, вероятно, действует в VB, а)

list1.Intersect(list2).Any() 
+0

Как насчет производительности, не делает ли это полное пересечение перед проверкой соответствия элементов? – jor

+1

, если говорить о выступлениях разработчиков, это победа :) –

+0

и производительность мудрая, это не должно быть проблемой, поскольку LINQ ленив. Итак, как только один элемент пересекается, он вернется (при условии, что Intersect ленив, и я думаю, что это так) –