Mam listę. Z ważnych powodów wielokrotnie duplikuję Listę i używam go do różnych celów. W pewnym momencie muszę sprawdzić, czy zawartość wszystkich tych kolekcji jest taka sama.sposób sprawdzania zawartości kolekcji (> 2) są takie same
Cóż, wiem, jak to zrobić. Ale będąc fanem kodowania "short hand" (linq ...) chciałbym wiedzieć, czy mogę to sprawdzić WYDAJNIE z najkrótszą liczbą linii kodu.
List<string> original, duplicate1, duplicate2, duplicate3, duplicate4
= new List<string();
//...some code.....
bool isequal = duplicate4.sequenceequal(duplicate3)
&& duplicate3.sequenceequal(duplicate2)
&& duplicate2.sequenceequal(duplicate1)
&& duplicate1.sequenceequal(original);//can we do it better than this
UPDATE
Codeinchaos wskazał pewne senarios I miałaś myśli (duplikatów i kolejność listy) .Though sequenceequal zajmie duplikatów kolejność na liście może być problem. Zmieniam kod w następujący sposób. Muszę skopiować listy dla tego.
List<List<string>> copy = new List<List<int>> { duplicate1, duplicate2,
duplicate3, duplicate4 };
bool iseqaul = (original.All(x => (copy.All(y => y.Remove(x))))
&& copy.All(n => n.Count == 0));
Update2
Dzięki Eric-użyciu HashSet może być bardzo skuteczny w następujący sposób. Nie przykryje to jednak duplikatów.
List<HashSet<string>> copy2 =new List<HashSet<string>>{new HashSet<string>(duplicate1),
new HashSet<string>(duplicate2),
new HashSet<string> duplicate3),
new HashSet<string>(duplicate4)};
HashSet<string> origninalhashset = new HashSet<string>(original);
bool eq = copy2.All(x => origninalhashset.SetEquals(x));
UPDATE3 Dzięki Eric - Oryginalny kod w tym poście z SequenceEqual będzie współpracować z sortowania. Ponieważ Sequenceequal uwzględni kolejność zbiorów, zbiory muszą zostać posortowane przed wywołaniem sequenceequal. Domyślam się, że to nie jest dużo probelmu, ponieważ sortowanie jest dość szybkie (nlogn).
UPDATE4 Zgodnie z sugestią Briana, mogę użyć odnośnika do tego.
var originallkup = original.ToLookup(i => i);
var lookuplist = new List<ILookup<int, int>>
{ duplicate4.ToLookup(i=> i),
duplicate3.ToLookup(i=> i),
duplicate2.ToLookup(i=> i),
duplicate1.ToLookup(i=> i)
};
bool isequal = (lookuplist.Sum(x => x.Count) == (originallkup.Count * 4)) &&
(originallkup.All(x => lookuplist.All(i => i[x.Key].Count() == x.Count())));
Dziękuję wszystkim za odpowiedzi.
Czy kolejność jest ważna? A może tylko treść? – weston
@ weston-tylko zawartość jest ważna – Jimmy
"Wydajność" lub "najkrótsza liczba linii kodu" Wybierz jedną – weston