为什么这会产生一个空集?
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();
当您进行选择时,您将获得一个IEnumerable<String>
. 然后,您将获取列表中每个字符串的类型(全是“String”)并将它们过滤掉它们不等于“Int32”(这是整个列表)的地方。因此...列表为空。
Equals 工作得很好,这是您的查询不正确。如果要选择列表中的整数,请使用:
var newTypes = types.Where( x => x.GetType().Name.Equals("Int32") )
.OrderBy( x => x );
颠倒操作顺序:
var newTypes = types.Where(x => x is int)
.OrderBy(x => x)
.Select(x => x.GetType().Name);
(请注意,这也使用直接类型检查而不是相当奇特的.GetType().Name.Equals(…)
)。
LINQ 的问题是您必须停止以 SQL 术语思考。在 SQL 中,我们这样认为:-
SELECT Stuff
FROM StufF
WHERE Stuff
ORDER BY Stuff
这就是你的代码的样子。但是在 LINQ 中,我们需要这样思考:-
FROM Stuff
WHERE Stuff
SELECT Stuff
ORDER BY Stuff
var newTypes = types.Select(x => x.GetType().Name)
.Where(x => x.Equals("Int32"))
.OrderBy(x => x);
这不起作用,因为 Select 语句会将集合中的每个值都转换为该值的基础类型的名称。结果集合将只包含字符串值,因此它们永远不会有名称 Int32。