LINQ列表包含特定值

4

我需要知道我正在处理的列表是否仅仅包含一些特定的值。

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

如果我想知道列表中是否至少有一个值为“First”的项目,我使用Any关键字:

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

我该如何编写一个Linq表达式,仅在列表包含“First”和“Second”值时返回true/false?

3个回答

5

我不完全确定您想要什么,但如果您想确保“First”和“Second”只出现一次,可以采取以下方法:

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();

另一方面,如果您想确保列表中的所有项目都来自白名单,并且每个白名单中的项目至少出现一次,我建议执行以下操作:
var set = new HashSet(list); set.SymmetricExceptWith(whiteList); var result = !set.Any();
编辑:实际上,Jon Skeet的SetEquals是表达最后一部分的更好方法。

如果我在这里写入以下内容会发生什么: list = new List<String> { "First", "First", "Second" }无论如何它是否会返回true? - Raffaeu
@Raffaeu:是的,我提供的所有3个示例都将返回true。 - Ani
谢谢,我会试试看。就我个人而言,我更喜欢第一种语法,它更接近 SQL。 - Raffaeu

4
你的问题不够清晰明了。
从第一句话来看,我认为你想问的是:
var onlyValidValues = !list.Except(validValues).Any();

换句话说:在你剔除有效值后,列表应该为空。
从最后一句话中,我希望得到这个结果:
var validSet = new HashSet<string>(requiredValues);
var allAndOnlyValidValues = validSet.SetEquals(candidateSequence);

请注意,如果您的候选序列包含多个相同的值,则此操作仍然有效。
如果您能够明确“成功标准”是什么,那么回答这个问题就更容易了。

@Raffaeu:请看我的编辑——基本上,你的问题目前可以被理解为非常不同的方式。 - Jon Skeet

2
您可以使用“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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接