将Collection Initializer与System.Data.DataTable.Rows一起使用

时间:2014-03-28 15:23:09

标签: c# collections ienumerable

据我所知,集合初始化程序的使用取决于两件事:

  • 该集合实现IEnumerable
  • Add()方法

据我所知System.Data.DataTable.Rows满足这两个要求,因此我希望我能做到这一点:

DataRow row = _dt.Tables["TABLE"].NewRow();

_dt.Tables["TABLE"].Rows =
{
    row
};

编译器抱怨:

  • Rows没有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"}
        };

1 个答案:

答案 0 :(得分:2)

Object and collection initializers仅在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 = ...而不是{{ 1}}。

在原始示例中,只需显式调用table.Rows.Add(...)方法:

Add