4

为什么这会产生一个空集?

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

6 回答 6

11

当您进行选择时,您将获得一个IEnumerable<String>. 然后,您将获取列表中每个字符串的类型(全是“String”)并将它们过滤掉它们不等于“Int32”(这是整个列表)的地方。因此...列表为空。

于 2009-11-04T16:54:41.140 回答
5

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

var newTypes = types.Where( x => x.GetType().Name.Equals("Int32") )
                    .OrderBy( x => x );
于 2009-11-04T16:57:17.373 回答
5

颠倒操作顺序:

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

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

于 2009-11-04T16:57:36.680 回答
3

LINQ 的问题是您必须停止以 SQL 术语思考。在 SQL 中,我们这样认为:-

SELECT Stuff
FROM StufF
WHERE Stuff
ORDER BY Stuff

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

FROM Stuff
WHERE Stuff
SELECT Stuff
ORDER BY Stuff
于 2009-11-04T17:12:05.340 回答
1
var newTypes = types.Select(x => x.GetType().Name)
    .Where(x => x.Equals("Int32"))
    .OrderBy(x => x);
于 2009-11-04T16:56:23.297 回答
1

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

于 2009-11-04T16:56:27.813 回答