代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

为什么.equals在这个linq示例中不起作用?

  •  4
  • Edward Tanguay  · 技术社区  · 15 年前

    为什么会产生一个空的集合?

    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 回复  |  直到 15 年前
        1
  •  11
  •   Indeed is Trash    15 年前

    当你选择的时候,你会得到一个 IEnumerable<String> . 然后将列表中每个字符串的类型(都是“字符串”)过滤掉它们不等于“int32”(整个列表)的地方。因此…列表是空的。

        2
  •  5
  •   tvanfosson    15 年前

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

    var newTypes = types.Where( x => x.GetType().Name.Equals("Int32") )
                        .OrderBy( x => x );
    
        3
  •  5
  •   Konrad Rudolph    15 年前

    颠倒操作顺序:

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

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

        4
  •  3
  •   AnthonyWJones    15 年前

    Linq的问题是你必须停止用SQL术语思考。在SQL中,我们这样认为:

    SELECT Stuff
    FROM StufF
    WHERE Stuff
    ORDER BY Stuff
    

    这就是您的代码的外观。然而,在Linq,我们需要这样思考:

    FROM Stuff
    WHERE Stuff
    SELECT Stuff
    ORDER BY Stuff
    
        5
  •  1
  •   Darin Dimitrov    15 年前
    var newTypes = types.Select(x => x.GetType().Name)
        .Where(x => x.Equals("Int32"))
        .OrderBy(x => x);
    
        6
  •  1
  •   JaredPar    15 年前

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