2013-05-08 12 views
5

Jaki jest najszybszy i najlepszy sposób porównania 2 list i zwrócenia dopasowania. Tylko jeden mecz jest możliwy. Lista1 zawiera dynamiczne dane z bazy danych.Porównaj Lista i zwróć mecze w C#

Sposób zrobić to teraz:

foreach (var item1 in List1) 
{ 
    foreach (var item2 in List2) 
    { 
     if(item2 == item1) 
     string match = item1; 
    } 
} 

mam wrażenie, jak można to zrobić dużo szybciej.

Odpowiedz

11

Użyj Enumerable.Intersect.

var matchItem = List1.Intersect(List2).First(); 

Nie jestem pewien, ile jest szybszy do obecnego kodu, można go zmierzyć za pomocą Stoper. Ale w twoim obecnym kodzie powinieneś złamać wewnętrzną, jak i zewnętrzną pętlę, znajdując dopasowanie. Coś jak:

foreach (var item1 in List1) 
{ 
    string match = null; 
    foreach (var item2 in List2) 
    { 
     if (item2 == item1) 
     { 
      match = item1; 
      break; 
     } 
    } 
    if (match != null) 
     break; 
} 
+1

i sprawdzi, czy to działa – Bernardmoes

+0

@Habib, jest to szybsze i zwięzły? mam na myśli, czy to wewnętrznie robi to samo lopping? – tariq

+0

@tariq, tak, wewnętrznie wykonuje pętlę, nie jestem pewien, czy jest szybszy, dlatego udostępniłem drugą opcję zmodyfikowanego kodu z pytania. – Habib

2

Masz wiele sposobów na zrobienie tego. Zależy to głównie od danych, które próbujesz dopasować.

  • Pierwsza rzeczą, jaką możesz zrobić, to o posortowana lista
  • wtedy, jeśli znasz wartość środku listy można iterację listy od początku od końca
  • ale przeważnie tylko zwrócić wartość od momentu znalezienia wartości:

także pierwsze 2 punkty będą działać tylko wtedy, gdy lista ma pewną wartość liczbową, na której można polegać w celu zidentyfikowania przedmiotu.

Pierwszy optymalizacji można zrobić, to:

Foreach (var item1 in List1) 
{ 
    Foreach (var item2 in List2) 
    { 
     if(item2 == item1) return item1; 
    } 
} 

Jeśli naprawdę potrzebujesz tej rutyny się bardzo szybko będziesz musiał zrobić optymalizacji oparte na danych, które są w swoich listach.

Również jeśli twoje dane to string na obu listach, możesz wygenerować kod skrótu dla każdego ciągu znaków (string.GetHashCode), a następnie polegać na haśle do sortowania i wyszukiwania na listach.

Istnieje wiele innych sposobów, ale to wszystko zależy od:

  • ilość danych masz w swoich listach (jeśli masz tylko 100 elementów nie będzie widać dużo wzrost wydajności)
  • jeśli listy są statyczne lub dynamiczne
  • jak często można je zmienić, jeśli są one dynamiczne
  • jak często można dokonać wyszukiwania w tych listach
  • ...
1

Możesz spętać pętle, gdy znajdziesz jakieś zapałki. Następnie można użyć metody, która zwraca element, który pasuje, lub null, jeśli żaden dopasowane (zakładając, że elementy są rodzaje referencje):

foreach (var item1 in List1) 
    foreach (var item2 in List2) 
     if (item2 == item1) 
      return item1; 

return null;