Sobes.tech
Middle

Co je třeba udělat, aby bylo možné porovnat obsah dvou kolekcí?

sobes.tech AI

Odpověď od AI

Existuje několik přístupů:

  1. Porovnání po elementech se seřazením. Obě kolekce se seřadí a poté se porovnají podle indexu.
  2. Porovnání pomocí LINQ.
    • SequenceEqual: Porovnává obsah dvou kolekcí element po elementu, přičemž bere v úvahu pořadí.
    • Intersect: Najde společné prvky v obou kolekcích.
    • Except: Najde prvky, které jsou v jedné kolekci, ale chybí v druhé.
    • Union: Spojí jedinečné prvky obou kolekcí.
  3. Použití HashSet. Převádíme jednu z kolekcí na HashSet pro rychlé vyhledávání a porovnávání.

Při výběru metody je třeba vzít v úvahu:

  • Pořadí prvků: Je důležité pořadí prvků při porovnávání?
  • Výkon: Pro velké kolekce mohou být efektivnější metody s použitím hash tabulek nebo třídění.
  • Duplikáty: Jak zacházet s duplicitními prvky?

Příklad použití LINQ SequenceEqual:

using System.Collections.Generic;
using System.Linq;

// ...

List<int> list1 = new List<int> { 1, 2, 3 };
List<int> list2 = new List<int> { 1, 2, 3 };
List<int> list3 = new List<int> { 3, 2, 1 };

// Porovnává obsah s ohledem na pořadí
bool jsouRovnePoPoradí = list1.SequenceEqual(list2); // true
bool jsouRovnePoPoradí2 = list1.SequenceEqual(list3); // false

Příklad použití LINQ Intersect:

using System.Collections.Generic;
using System.Linq;

// ...

List<int> list1 = new List<int> { 1, 2, 3, 4 };
List<int> list2 = new List<int> { 3, 4, 5, 6 };

// Najde společné prvky
IEnumerable<int> spolecnePrvky = list1.Intersect(list2); // { 3, 4 }

Příklad použití HashSet:

using System.Collections.Generic;
using System.Linq;

// ...

List<int> list1 = new List<int> { 1, 2, 3 };
List<int> list2 = new List<int> { 3, 1, 2 };

// Vytvoříme `HashSet` z kolekce pro rychlé vyhledávání
HashSet<int> set1 = new HashSet<int>(list1);

// Zkontrolujeme, zda všechny prvky druhé kolekce jsou v první
bool obsahujeVsechno = list2.All(item => set1.Contains(item)); // true

// Další kontrola, zda obě kolekce mají stejný počet unikátních prvků
if (obsahujeVsechno && set1.Count == list2.Distinct().Count())
{
    // Kolekce obsahují stejné prvky bez ohledu na pořadí
}