2011-01-06 221 views
2

我需要知道,如果我正在使用的列表包含只有一些具体的值。Linq列表包含特定值

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

如果我想知道,如果这个名单上有与值的至少一个项目“快速”我用的是任何关键字:

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

但我怎么能写一个LINQ表达式仅当列表包含“第一”和“第二”值时才会返回真/假?

回答

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

在另一方面,如果你想确保个列表中的所有项目是从白名单在白名单中的每个项表示至少有一次,我会做:

VAR组=新的HashSet(名单) ; set.SymmetricExceptWith(whiteList); var result =!set.Any();

编辑:其实,乔恩斯基特的SetEquals是表达的最后一位的更好的方法。

+0

这是什么发生,如果我写的东西在这里,如: 名单=新名单 {“第一”,“第一”,“第二”} 将它返回true呢? – Raffaeu 2011-01-06 15:54:39

+0

@Raffaeu:是的,我提供的所有3个样本都会返回true。 – Ani 2011-01-06 15:57:35

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

注意这仍将是有效的,如果你的候选序列包含相同的值多次。

如果你可以澄清刚好你的成功标准是什么,这将更容易精确地回答这个问题。