c# - 匿名类型不是匿名的
问题描述
我有一个具有字符串属性的类:
public class User
{
public string Name { get; set; }
public int OtherProperty { get; set; }
}
我可以像这样选择Name
s的列表List<User> MyListOfUsers
:
List<string> MyNames = MyListOfUsers.Select(x => x.Name).ToList();
在我的头脑中,我首先尝试通过匿名类型来做同样的事情:
List<string> MyNames = MyListOfUsers.Select(x => new { x.Name }).ToList();
但这告诉我
无法转换类型
List< <anonymous type: string Name> > to List<string>
但它知道这是一个字符串吗?当它清楚地知道“匿名类型”是一个字符串时,为什么它不允许这种语法?
解决方案
您正在创建的匿名类型不是字符串。它是一个具有名为 Name 的字符串属性的类。
您的代码相当于
List<string> MyNames = MyListOfUsers.Select(x => new { Name = x.Name }).ToList();
但是 C# 允许您通过说new {x.Name}
而不是new {Name = x.Name}
.
C# 中的匿名类型是从 object 继承的类,即使它们只包含一个字符串属性,它们也不能转换为字符串,如文档所述:
匿名类型是直接从 object 派生的类类型,并且不能转换为除 object 之外的任何类型。
至于你的初衷,这是正确的
List<string> MyNames = MyListOfUsers.Select(x => x.Name).ToList();
使用新的匿名类不仅是语法不同,还会导致不同的内存占用和 GC 负载。在您的用例中是不必要的。
推荐阅读
- javascript - 当第二个数组是第一个数组中的键时,根据另一个数组对一个数组进行排序。
- javascript - IOS safari 或 Chrome 通过 USB 读/写文件
- python - python无法导入时区但可以导入日期时间
- user-interface - 仅当鼠标位于 JTextField 中时按下 ENTER 键时才运行特定代码的侦听器?
- documentum - 如何使用 DQL 更新 Documentum 中的锁定记录?
- r - 闪亮的应用程序 R;不接受输入
- sqlite - Xamarin 与 AzureMobileServices 脱机同步:初始脱机加载速度非常慢
- excel - 带切片机的 CUBESET
- excel - 检查并比较在组合框中输入的值
- python - 如何在 TensorFlow CNN 模型中初始化权重?