2013-06-14 4 views
1

Надеюсь выяснить, есть ли простой способ проверить, содержит ли список только определенные значения списка.Только список C# содержит

Например, если у меня есть список int, который может случайным образом содержать отдельные ints 1-10 (т.е. 1,3,7 или 2,3,4,6,8,9), и я хочу проверить, включен ли список только содержит int 1 и/или 5. 1 или 5 или 1,5 возвращает true, а что-то еще возвращает false.

Это на самом деле проект MVC и список строк. Исходя из условий, я строю список строк и хочу проверить, присутствует ли в списке 1 или оба из двух определенных строк, но нет других строк.

Теперь я беру список и проверяю, содержит ли он каждую из двух строк и удаляет их, если они существуют. Затем я могу подсчитать список, и если> 0, я знаю, что 1 или обе строки не являются единственными значениями в списке. Это кажется очень хакивым, и я предполагаю, что есть лучший способ сделать это. Также в будущем, если бы мои две строки были вместо другого динамического списка строк, было бы неплохо иметь простой метод, вместо того чтобы иметь перед собой каждую строку обоих списков, чтобы удалить их из одного, если они существуют в другом, прежде чем я смогу подсчитать список, чтобы получить мне нужно.

Надеюсь, что что-то похожее на .Contains (T Item), как .OnlyContains (T Item или IEnumerable), но пока не нашел ничего подобного.

Спасибо.

+2

Если проверить только 1 и 5, то почему бы список 1, 3, 7 дают верно? Он не содержит только 1 или 5. – Guffa

+1

Так как ваши списки содержат только отдельные 'int', вы можете использовать' SortedSet 'вместо' List '. Хорошо, что «наборы» имеют такие методы, как «IsSubsetOf» и «IsSupersetOf». –

+0

Ваше право Я написал примеры совершенно неправильно, исправил их в сообщении сейчас. –

ответ

13
if (someList.Except(desiredItems).Any()) 
    // Uh oh 
+0

Бинго это выглядит именно то, что я искал. Я определенно буду использовать .Except() больше в будущем. Благодаря! –

1

Если я правильно понял вопрос, вы хотите знать, содержит ли коллекция какие-либо предметы в другой коллекции. Используйте Enumerable.Intersect:

var ints1 = new[] { 1, 3, 7 }; 
var ints2 = new [] { 2, 3, 4, 6, 8, 9 }; 
var list = new[] { 1, 5 }; 
bool containsAny = ints1.Intersect(list).Any(); 
Console.WriteLine(containsAny); // True 
containsAny = ints2.Intersect(list).Any(); 
Console.WriteLine(containsAny); // False 

включить также это требование

Перечень 1,5 или список без каких-либо элементов также возвращает истину.

Просто проверьте, если коллекция содержит все элементы:

bool any = list.Any(); 
+0

Извините, вероятно, объяснил это плохо. Мысль о Intersect, но я пытался проверить, содержит ли список ТОЛЬКО значения, которые команда intersect вернет не только в случае пересечения. –

+0

Но ваши данные образца + желаемый результат рассказали другую историю. _ "1,3,7 или 2,3,4,6,8,9, и я хочу проверить, содержит ли список только int 1 и/или 5. В моих 2 примерах 1,3,7 вернутся ** true ** и 2,3,4,6,8,9 вернутся ** false ** "_ –

+0

Да, ваше право, я перепутал это время. Я отредактировал свой пост сейчас, извините. –

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