为什么.Equals在这个LINQ示例中不起作用?

时间:2009-11-04 16:53:21

标签: c# linq linqpad

为什么这会产生空集?

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

6 个答案:

答案 0 :(得分:11)

当您选择时,您将获得IEnumerable<String>。然后你将列表中的每个字符串的类型(都是“字符串”)并过滤掉它们不等于“Int32”(这是整个列表)。 Ergo ......列表是空的。

答案 1 :(得分:5)

Equals工作得很好,这是你的查询不正确。如果要在列表中选择整数,请使用:

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

答案 2 :(得分:5)

颠倒操作的顺序:

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

(请注意,这也使用了直接类型检查,而不是相当特殊的.GetType().Name.Equals(…))。

答案 3 :(得分:3)

LINQ的问题是你必须停止用SQL术语思考。在SQL中我们这样想: -

SELECT Stuff
FROM StufF
WHERE Stuff
ORDER BY Stuff

这就是你的代码的样子。但是在LINQ中,我们需要这样思考: -

FROM Stuff
WHERE Stuff
SELECT Stuff
ORDER BY Stuff

答案 4 :(得分:1)

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

答案 5 :(得分:1)

这不起作用,因为Select语句会将集合中的每个值转换为该值的基础类型的名称。生成的集合将仅包含字符串值,因此它们将不具有名称Int32。