2013-01-04 35 views
1

我有這樣的λ表達式:Lambda表達式的任何返回錯誤值

if (!myList.Any(x => x.name == "example" && x.articleNumber == "1")) 
{ 

} 
else 
{ 

} 

myList中含有由具有這些特性的類的對象:articleNumber,名稱和數量。

而這進入了if而不是在else中,雖然有一個名爲「example」和articleNumber「1」的對象。爲什麼會發生?

+1

myList的內容是什麼? –

+0

如果你**沒有**名稱* example和acticleNumber * 1 *的條目*它**應該**進入if塊。 –

+0

因爲'myList'的元素不匹配謂詞嗎?如果你認爲*應該匹配*,我會再次檢查。 (調試器會在這裏成爲你的朋友,如果你願意的話,你可以遍歷列表) –

回答

1

唯一的原因,我可以看到的是,有一個與name=="example"articleNumber=="1"沒有元素。請注意,==運算符在C#中區分大小寫,並且可能在某處存在空格。

然後你就可以使用這個​​與Trim比較不區分大小寫,並刪除空白頻段:

if (!myList.Any(x => x.name.Trim().Equals("example", StringComparison.OrdinalIgnoreCase) 
        && x.articleNumber == "1")) 
{ 

} 
else 
{ 

} 

你也應該考慮到的articleNumber的類型更改爲int,因爲它是一個數字。

4

您的lamda之前您知道!是嗎?

你問if語句是

如果myList中不包含任何值,其中名字爲例子,文章編號爲1

我不知道這是否幫助,但也許它更容易如果您提供更多關於您想要完成聲明的信息,請回答。

1

我敢肯定,該列表不包含您認爲它的條目。在if行上設置調試標記,然後檢查該列表以查看它包含的內容。你會發現該條目不存在。請記住,字符串也是區分大小寫的,所以如果名稱確實是Example,它將不匹配。

+0

我做到了,它確實如此。 –

+0

它至少不包含**。我確定*任何*都不會被吸收掉。 –

+1

所以最可能的結果看起來是一樣的,在文本「例子」中有一個問題,或者兩個字符串之一中的某個空格。 –

0

你的邏輯沒有錯,但你counld嘗試?

if (myList.Where(x => x.name == "example").Where(x=> x.articleNumber == "1").Count() > 0) 
{ 

} 
else 
{ 

} 

或刪除所有的空格和差異在套管

if (!myList.Any(x => x.name.Trim().ToLower() == "example" && x.articleNumber.Trim().ToLower() == "1")) 
{ 

} 
else 
{ 

} 
+1

爲什麼你會將if語句複雜化以產生完全相同的結果? –

-1

Any的定義: 確定序列的任何元素是否存在或滿足條件。

因此,對於序列中的每個元素,確定謂詞是否與您的表達式匹配。如果列表中的任何元素的名稱爲「榜樣」和articleNumber如果列表中沒有元素的名稱爲「榜樣」和1

!myList.Any(x => x.name == "example" && x.articleNumber == "1") 

將返回true

myList.Any(x => x.name == "example" && x.articleNumber == "1") 

將返回true文章編號1.

1

您的列表可能包含一些您不期望的值。

嘗試用||更換&&,看看你會得到什麼:

var v = myList.Where(x => x.name == "example" || x.articleNumber == "1").ToList(); 

只是爲了看看有什麼有 。