使用System.Data.DataTable.Rows的集合初始化器
本文关键字:集合 初始化 Rows System Data DataTable 使用 | 更新日期: 2023-09-27 17:54:26
据我所知,集合初始化式的使用取决于两件事:
- 集合实现了IEnumerable
- Add()方法
据我所知,System.Data.DataTable.Rows
满足这两个要求,因此我希望我可以这样做:
DataRow row = _dt.Tables["TABLE"].NewRow();
_dt.Tables["TABLE"].Rows =
{
row
};
编译器报错:
- 行没有setter(但我不是创建一个新的集合,只是通过提供的参考添加到现有的一个 )
也许你能指出我的错误。
更新:
我刚刚意识到我的问题是DataRowCollection
不实现IEnumerable
,但有Add()
方法。因此,我认为这并不纯粹是因为IEnumerable
没有实现,这是正确的吗?如果有,为什么不能加入BCL?
更新:
请参阅下面的代码,该代码显示您可以使用初始化项向现有集合添加:
public class Person
{
public Person()
{
friends.Add("Paul");
}
List<string> friends = new List<string>();
public List<string> Friends
{
get { return friends; }
}
}
Person tom = new Person
{
//Adding to an existing collection NOT creating a new one
Friends = {"Steve", "Jim", "John"}
};
对象和集合初始化式仅在由new
关键字引入的"对象创建表达式"中有效。来自c# 4.0规范§7.6.10.1:
对象建立表达式:
new
型(
参数列表<子>选择子>)
对象或集合初始化器<子>选择子>new
对象或集合初始化器对象或集合初始化器:
对象初始化器
集合初始化器
和§7.6.10.2:
对象初始化项由一系列成员初始化项组成,由
{
和}
标记括起,并用逗号分隔。在等号后面指定集合初始化式的成员初始化式是内嵌集合的初始化。不是给字段或属性赋值一个新的集合,而是将初始化式中给出的元素添加到字段或属性引用的集合中。
因此,下面是一个合法的语句,它创建了一个新的DataTable
,并使用几个集合初始化式,将项目添加到嵌入的Columns
和Rows
集合中:
DataTable table =
new DataTable // <-- IMPORTANT
{
Columns = { { "Name", typeof(string) } }, // table.Columns.Add("Name", typeof(string));
Rows = { "John" }, // table.Rows.Add("John");
};
相反,下面的语句是无效的:
table.Rows = { "John" };
尽管该表达式类似于集合初始化式,但它出现在对象创建表达式的上下文之外(任何地方都没有new
关键字),因此编译器将该语句解析为table.Rows = ...
而不是table.Rows.Add(...)
。
在您的原始示例中,只需显式调用Add
方法:
_dt.Tables["TABLE"].Rows.Add(row);