Comme l'écrit, cette question est ambiguë. La déclaration:
... ils ont tous deux les mêmes éléments, quelle que soit leur position dans la liste.
Chaque MyType objet peut apparaître plusieurs fois sur une liste.
ne pas indiquer si vous voulez vous assurer que les deux listes ont le même ensemble d'objets ou le même ensemble distinct.
Si vous voulez assurer aux collections ont exactement le même ensemble de membres, quel que soit l'ordre, vous pouvez utiliser:
// lists should have same count of items, and set difference must be empty
var areEquivalent = (list1.Count == list2.Count) && !list1.Except(list2).Any();
Si vous voulez vous assurer que les deux collections ont le même ensemble distinct de membres (d'où les doublons dans les deux sont ignorés), vous pouvez utiliser:
// check that [(A-B) Union (B-A)] is empty
var areEquivalent = !list1.Except(list2).Union( list2.Except(list1) ).Any();
En utilisant l'ensemble des opérations (Intersect
, Union
, Except
) est plus efficace que l'utilisation de méthodes comme l' Contains
. À mon avis, il est aussi mieux exprime les attentes de votre requête.
EDIT: Maintenant que vous avez précisé votre question, je peux dire que vous voulez utiliser la première forme - depuis les doublons question. Voici un exemple simple pour montrer que vous obtenez le résultat que vous souhaitez:
var a = new[] {1, 2, 3, 4, 4, 3, 1, 1, 2};
var b = new[] { 4, 3, 2, 3, 1, 1, 1, 4, 2 };
// result below should be true, since the two sets are equivalent...
var areEquivalent = (a.Count() == b.Count()) && !a.Except(b).Any();