2011-01-06 3 views
2

Мне нужно знать, содержит ли Список, с которым я работаю, только некоторые конкретные значения.Список Linq содержит определенные значения

var list = new List<string> { "First", "Second", "Third" }; 

Если я хочу знать, если список содержит по крайней мере один элемент со значением «First» Я использую Любое ключевое слово:

var result = list.Any(l => l == "First"); 

Но как я могу написать выражение Linq, что вернет true/false только в том случае, если List содержит значения «First» и «Second»?

ответ

4

Я не совсем уверен, что вы хотите, но если вы хотите, чтобы убедиться, что «первый» и «второй» представлены один раз, вы можете сделать:

var result = list.Where(l => l == "First" || l =="Second") 
       .Distinct() 
       .Count() == 2; 

или:

var result = list.Contains("First") && list.Contains("Second"); 

Если у вас есть длинный «белый список», вы можете сделать:

var result = !whiteList.Except(list).Any(); 

с другой стороны, если вы хотите, чтобы убедиться, что всех элементов в списке из белого списка и что каждые элемента в белом списке представлен по крайней мере один раз, я хотел бы сделать:

уагом комплекта = новый HashSet (список) ; set.SymmetricExceptWith (whiteList); var result =! Set.Any();

EDIT: На самом деле, Джон Скита SetEquals это гораздо лучший способ выражения последнего бита.

+0

Что произойдет, если я пишу здесь что-то вроде: список = новый список { «Первый», «Первый», «Второй»} Будет ли он вернуться правда так или иначе? – Raffaeu

+0

@ Raffaeu: Да, все 3 образца, которые я предоставил, вернут true. – Ani

+0

Спасибо, я дам ему шанс, мне лично нравится первый синтаксис, это больше SQLish – Raffaeu

1

Вы можете использовать Intersect для поиска совпадений:

var list = new List<string> { "First", "Second", "Third" }; 
var comparelist = new List<string> { "First", "Second" }; 

var test = list.Intersect(comparelist).Distinct().Count() == comparelist.Count(); 
4

Ваш вопрос остается неясным.

Из первого предложения, я бы ожидать, что это будет то, что вы после:

var onlyValidValues = !list.Except(validValues).Any(); 

Другими словами: после того, как вы раздели действительные значения, список должен быть пустым.

Из последнего предложения, я бы ожидать, что это:

var validSet = new HashSet<string>(requiredValues); 
var allAndOnlyValidValues = validSet.SetEquals(candidateSequence); 

Обратите внимание, что это будет по-прежнему в силе, если ваша последовательность кандидата содержит то же значение, несколько раз.

Если вы в состоянии уточнить , каковы будут ваши критерии успеха, было бы проще точно ответить на вопрос.

+0

COOL, это очень аккуратно! – Raffaeu

+0

@ Raffaeu: Пожалуйста, см. Мое редактирование. В принципе, ваш вопрос может быть прочитан по-разному. –

+0

Я также дал вам одно очко по этой причине – Raffaeu

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