2011-01-06 106 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); 

注意這仍將是有效的,如果你的候選序列包含相同的值多次。

如果你可以澄清剛好你的成功標準是什麼,這將更容易精確地回答這個問題。