LINQ: проверьте, являются ли два списка одинаковыми

Это должно быть легко.

Я хочу проверить, совпадают ли два списка в том, что они содержат все те же элементы или нет, причем заказы не важны.

Дублированные элементы считаются равными, т.е. new[]{1,2,2} совпадает с new[]{2,1}

Ответы

Ответ 1

var same = list1.Except(list2).Count() == 0 && 
           list2.Except(list1).Count() == 0;

Ответ 2

Изменить: Это было написано до того, как OP добавил, что {1, 2, 2} равно {1, 1, 2} (относительно обработки повторяющихся записей).

Это будет работать до тех пор, пока элементы будут сопоставимы для заказа.

bool equal = list1.OrderBy(x => x).SequenceEqual(list2.OrderBy(x => x));

Ответ 3

SetEquals HashSet лучше всего подходит для проверки того, являются ли два набора равными, как определено в этом вопросе

        string stringA = "1,2,2";
        string stringB = "2,1";

        HashSet<string> setA = new HashSet<string>((stringA.Trim()).Split(',').Select(t => t.Trim()));
        HashSet<string> setB = new HashSet<string>((stringB.Trim()).Split(',').Select(t => t.Trim()));

        bool isSetsEqual = setA.SetEquals(setB);

ССЫЛКА:

Ответ 4

Вам нужно получить пересечение двух списков:

bool areIntersected = t1.Intersect(t2).Count() > 0;

В ответ на ваш измененный вопрос:

bool areSameIntersection = t1.Except(t2).Count() == 0 && t2.Except(t1).Count() == 0;

Ответ 5

Если количество элементов list1 в списке2 равно количеству элементов списка2 в списке1, тогда списки содержат одинаковое количество элементов, оба являются подмножествами друг друга - другими словами, оба они содержат одни и те же элементы.

if (list1.Count(l => list2.Contains(l)) == list2.Count(l => list1.Contains(l)))
    return true;
else
    return false;