我正在阅读 LINQ 并看到 Collection Initializers 出现,但它真的像 Object Initializers 那样与 LINQ 直接相关吗?
List<string> stringsNew = new List<string> { "string 1", "string 2" };
我正在阅读 LINQ 并看到 Collection Initializers 出现,但它真的像 Object Initializers 那样与 LINQ 直接相关吗?
List<string> stringsNew = new List<string> { "string 1", "string 2" };
集合初始化器可以说是与 Linq 相关的,因为你可以感谢 Linq 将该特性引入 C# 3。万一链接的问题发生了什么事,有用的文本是
集合初始化器的典型使用场景所激发的设计目标是使现有集合类型的初始化可以在表达式语法中进行,以便集合初始化器可以嵌入到查询理解中或转换为表达式树。
其他所有场景的优先级都较低;该功能之所以存在,是因为它有助于使 LINQ 工作。
——埃里克·利珀特
它们在 Linq 的上下文中很有用,因为它们使您能够编写类似以下示例的内容
var query = from foo in foos
select new Bar
{
ValueList = new List<string> { foo.A, foo.B, foo.C }
};
您可以在其中构造一个查询,该查询将给定投影foo
到Bar
带有 foo 属性值列表的 a 中。如果没有这样的初始化程序支持,您将无法创建这样的查询(尽管您可以将 ValueList 转换为静态长度数组并实现类似的效果)。
但是,就像 C# 3+ 中新增的对象初始化器和其他特性一样,许多为使 Linq 工作而受到启发或明确添加的特性无疑在与 Linq 完全无关的代码中很有用,而且它们不需要 Linq 工作(通过 using 指令或 DLL 引用)。初始化器最终只不过是语法糖,编译器将把它变成更长的代码,你必须在早期的语言版本中自己编写。
对象和集合初始化器与 LINQ 无关——它们是完全不相关的语言特性。
任何具有Add
实现方法的类IEnumerable
都可以使用集合初始值设定项。大括号中的项目将一次添加一个,而不必重复调用inst.Add(item1)
.