使用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"}
        };

使用System.Data.DataTable.Rows的集合初始化器

对象和集合初始化式仅在由new关键字引入的"对象创建表达式"中有效。来自c# 4.0规范§7.6.10.1:

对象建立表达式:
new ( 参数列表<子>选择 ) 对象或集合初始化器<子>选择
new 对象或集合初始化器

对象或集合初始化器:
对象初始化器
集合初始化器

和§7.6.10.2:

对象初始化项由一系列成员初始化项组成,由{}标记括起,并用逗号分隔。

在等号后面指定集合初始化式的成员初始化式是内嵌集合的初始化。不是给字段或属性赋值一个新的集合,而是将初始化式中给出的元素添加到字段或属性引用的集合中。

因此,下面是一个合法的语句,它创建了一个新的DataTable,并使用几个集合初始化式,将项目添加到嵌入的ColumnsRows集合中:

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);