2010-10-07 2 views
1

У меня есть ситуация, когда у меня есть список идентификаторов, таких как {1,2,3,4}. Мне нужно передать в метод другой список идентификаторов, и если список имеет одинаковые числа в нем, верните true, иначе, если какой-либо список не идентичен (без учета порядка), мне нужно вернуть false. Таким образом, вызов метода с {1,2,3,4,5} должен возвращать значение false, а вызов с {2,4,1,3} возвращает true. Это звучит достаточно просто, но я не могу понять, как это сделать.Как создать этот запрос linq

ответ

0

Если вы гарантированно не имеют повторяющиеся элементы в idList, вы можете использовать следующее:

if (idList.Count == otherIDList.Count && 
    idList.Intersect(otherIDList).Count() == idList.Count) 
{ 
    // Contain same things. 
} 
else 
{ 
    // Do not contain same things. 
} 

Первая проверка, чтобы убедиться, что они одинакового размера. Это действительно дешевый способ увидеть, имеют ли списки даже возможность быть идентичными, так же, как со строками. Кроме того, без него утверждение вернет true, если otherIDList является надмножеством idList.

Если вы не можете гарантировать уникальность в коллекции, я думаю, вам придется что-то закодировать.

+0

Спасибо. Я думал о методе пересечения, но я не мог вспомнить, как он называется. Еще раз спасибо! –

2

Самый простой способ, вероятно, это:

var idSet = new HashSet<int>(idList1); 
if (idSet.SetEquals(idList2)) 
{ 
    ... 
} 

Согласно комментариям, это будет считать {1, 1, 1, 1, 1} равным {1} - иными словами, рассматривает его как набор, а не неупорядоченный набор возможных дубликатов значений.

+0

Напоминание о том, что LINQ не является серебряной пулей для работы с коллекциями. –

+0

Я бы добавил, что это не сработает, если в списке повторяются элементы. Утверждается, что они являются идентификаторами в вопросе, и поэтому могут предположить, что они не повторяются. Но это не указано явно. – jdmichal

+0

@jdmichal: Правда. Будет обновление, чтобы упомянуть об этом. –

Смежные вопросы