【问题标题】:How to cast anonymous type to primitive type member using Lambda or Linq如何使用 Lambda 或 Linq 将匿名类型转换为原始类型成员
【发布时间】:2012-01-04 09:53:23
【问题描述】:

您好,我正在尝试使用 Lambda 表达式将匿名类型列表转换为原始类型列表,到目前为止我没有运气。

我知道我可以使用 foreach 循环遍历“a”并获取值,但我想知道如何在 Lambda 或 Linq 中执行此操作。

var a = new []{ new {name= "jerry", age = 32}, new {name="peter",age=23}};

List<string> b = a.Select(p => new System.String{p.name}).ToList();
List<int> c = a.Select(p => new System.Int32{p.age}).ToList();

【问题讨论】:

  • 我认为我们总是需要将它转换为一个对象。谢谢大家的回答。

标签: c# linq lambda


【解决方案1】:
        var a = new[] { new { name = "jerry", age = 32 }, new { name = "peter", age = 23 } };

        List<string> b = a.Select(p => p.name).ToList();
        List<int> c = a.Select(p => p.age).ToList(); 

问题在于您在new System.String{p.name} 中使用了 { 和 }。这不是实例化类型的有效方法。

【讨论】:

    【解决方案2】:
    var a = new[] { new { name = "jerry", age = 32 },new {name = "peter", age = 23}};
    
    List<string> b = a.Select(p => p.name).ToList();
    List<int> c = a.Select(p => p.age).ToList();
    

    【讨论】:

      【解决方案3】:

      你为什么尝试通过调用构造函数来实例化一个新实例?

      这个:

      var a = new []{ new {name= "jerry", age = 32}, new {name="peter",age=23}}; 
      
      List<string> b = a.Select(p => p.name}).ToList(); 
      List<int> c = a.Select(p => p.age).ToList(); 
      

      工作正常。 p.Age 是一个整数,因此是一个值类型。这意味着它是按值复制的,因此您确实会在列表 c 中获得唯一的副本。 p.name 是一个字符串。在 .NET 中,字符串是不可变的,因此共享字符串实例非常方便。

      另请注意,这两种构造甚至都不存在! 另外需要注意的是,调用构造函数时,需要使用 () 而不是 { }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-22
        • 1970-01-01
        • 2015-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-19
        相关资源
        最近更新 更多