Sobes.tech
Middle

Čo je potrebné urobiť na porovnanie obsahu dvoch kolekcií?

sobes.tech AI

Odpoveď od AI

Existuje niekoľko prístupov:

  1. Porovnanie po prvkoch so zoradením. Zoradíme obe kolekcie a potom porovnáme prvky podľa indexu.
  2. Porovnanie pomocou LINQ.
    • SequenceEqual: Porovná obsah dvoch kolekcií po prvkoch, berúc do úvahy poradie.
    • Intersect: Nájde spoločné prvky v oboch kolekciách.
    • Except: Nájde prvky, ktoré sú v jednej kolekcii, ale chýbajú v druhej.
    • Union: Zlučuje jedinečné prvky oboch kolekcií.
  3. Použitie hashových množín (HashSet). Prevedieme jednu z kolekcií na HashSet pre rýchle vyhľadávanie a porovnávanie.

Pri výbere metódy je potrebné zvážiť:

  • Poradie prvkov: Je poradie prvkov dôležité pri porovnávaní?
  • Výkon: Pre veľké kolekcie môžu byť efektívnejšie metódy s použitím hash-tabuliek alebo zoradenia.
  • Duplicitné prvky: Ako zaobchádzať s duplicitnými prvkami?

Príklad použitia 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áva obsah s ohľadom na poradie
bool areEqualOrdered = list1.SequenceEqual(list2); // true
bool areEqualOrdered2 = list1.SequenceEqual(list3); // false

Príklad použitia 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 };

// Nájde spoločné prvky
IEnumerable<int> commonElements = list1.Intersect(list2); // { 3, 4 }

Príklad použitia 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 };

// Vytvoríme HashSet z jednej kolekcie pre rýchle vyhľadávanie
HashSet<int> set1 = new HashSet<int>(list1);

// Kontrolujeme, či všetky prvky druhej kolekcie sú v prvej
bool containsAll = list2.All(item => set1.Contains(item)); // true

// Dodatočná kontrola, že obe kolekcie obsahujú rovnaký počet jedinečných prvkov
if (containsAll && set1.Count == list2.Distinct().Count())
{
    // Kolekcie obsahujú rovnaké prvky bez ohľadu na poradie
}