2009-11-04 86 views
4

爲什麼這會產生一個空集?爲什麼.Equals在這個LINQ示例中不起作用?

Object[] types = {23, 234, "hello", "test", true, 23}; 

var newTypes = types.Select(x => x.GetType().Name) 
    .Where(x => x.GetType().Name.Equals("Int32")) 
    .OrderBy(x => x); 

newTypes.Dump(); 
+0

它產生一個空集,因爲不存在Int32類型的字符串。我被迫*猜測*這不是你想知道的,但你沒有說出你想要完成的事情。 – Joren 2009-11-04 17:04:45

回答

11

當你做你的選擇你要的IEnumerable<String>。然後,您將列表中的每個字符串的類型(全部爲「String」)並將它們過濾出它們不等於「Int32」(這是整個列表)的位置。埃爾戈......名單是空的。

1
var newTypes = types.Select(x => x.GetType().Name) 
    .Where(x => x.Equals("Int32")) 
    .OrderBy(x => x); 
1

這不起作用,因爲Select語句會將集合中的每個值轉換爲該值的基礎類型的名稱。結果集合將只包含字符串值,因此它們永遠不會有名稱Int32。

5

Equals的工作很好,它是你的查詢是不正確的。如果你想在列表中選擇使用整數:

var newTypes = types.Where(x => x.GetType().Name.Equals("Int32")) 
        .OrderBy(x => x); 
5

反向操作的順序:

var newTypes = types.Where(x => x is int) 
    .OrderBy(x => x) 
    .Select(x => x.GetType().Name); 

(請注意,這也採用替代較爲特殊的.GetType().Name.Equals(…)直下型檢查)。

3

LINQ的東西是你必須停止思考SQL的條款。在SQL中,我們認爲是這樣的: -

SELECT Stuff 
FROM StufF 
WHERE Stuff 
ORDER BY Stuff 

這就是你的代碼的樣子。然而在LINQ中,我們需要這樣思考: -

FROM Stuff 
WHERE Stuff 
SELECT Stuff 
ORDER BY Stuff 
+1

是的,你必須記得喜歡悠達的想法 – 2009-11-05 08:55:21

相關問題