2012-01-31 56 views
8

例如:如何在线设置集合?

DataTable table = new DataTable() 
{ 
    Columns = new DataColumnCollection(
    { 
     new DataColumn("col1"), 
     new DataColumn("col2") 
    }) 
}); 
+0

这非常依赖于您使用的VS/.Net版本。 – 2012-01-31 16:54:57

+1

我更新了标签。 – 2012-01-31 16:56:08

回答

10

你都在谈论C#3中添加的Collection Initialiser 功能。它是这样完成的:

DataTable table = new DataTable() 
{ 
    Columns = 
    { 
     new DataColumn("col1"), 
     new DataColumn("col2") 
    } 
}; 

这不调用集合构造函数,它使用DataTable中已存在的集合。

这是Columns.Add()的缩写,因此它不需要列有setter。

你与你的问题中的代码如此接近!

+0

bea-u-ti-ful!好一个。 – 2012-01-31 17:27:45

2

你可能需要删除周围的集合初始的paretheses为DataColumnCollection,并删除无法比拟的,最终)

这些都是语法问题,但。根本问题是Columns属性没有setter,并且DataColumnCollection没有公共构造函数。

基本上,你必须实例化,然后调用.Columns.Add()

如果这是你必须做很多的代码,您可以创建辅助类,会给你更友好语法的东西:

DataTable table = DataTableFactory.CreateTableWithColumns("col1", "col2"); 
+0

我试图做到这一点。即使他纠正了语法错误,他也会得到一个错误,指出** Columns **是一个只读属性。 – 2012-01-31 17:01:18

+0

@Jay - 不错的想法+1 – 2012-01-31 17:09:46

3

Columns属性没有一个二传手,所以你只能修改它。

如何:

DataTable table = new DataTable(); 
table.Columns.AddRange(new[] { new DataColumn("col1"), new DataColumn("col2") }); 

如果你想要做的拉姆达一个声明:

DataTable table = (() => { 
    var table = new DataTable(); 
    table.Columns.AddRange(new[] { new DataColumn("col1"), 
            new DataColumn("col2") }); 
    return table;})(); 
+0

我想要全部内联。我认为有可能使用()=>或其他。 – 2012-01-31 17:02:46

+0

由于我在答案中给出的原因,您无法进行内联。如果你想保持代码清洁,你可以创建一个扩展方法来创建一个表,并在一个步骤中添加列,但在某一点上,它至少会有两行代码。 – 2012-01-31 17:05:47

+0

如果它有一个setter,它会怎么做?你能提供一个实例吗? – 2012-01-31 17:06:38

1

DataColumnCollection没有构造函数,所以你不能手动创建一个实例。编译器的错误信息应该是不言自明的,他说沿着线的东西:

类型“System.Data.DataColumnCollection”已经没有构造函数定义

您可以添加列DataTable.Columns收集使用Add()方法:

DataTable table = new DataTable(); 
table.Columns.Add(new DataColumn("col1")); 
table.Columns.Add(new DataColumn("col2")); 
1

为列属性为只读,您不能使用这种语法。我会使用Gabe建议的技术。

2

有2个原因,这是行不通的:

1)Columns属性为只读 2)DataColumnCollection类没有接受列的集合初始化它的构造函数。
你可以做的最好的是在同一行创建表并添加列在另一:

DataTable table = new DataTable(); 
table.Columns.AddRange(new [] 
    { 
     new DataColumn("col1"), 
     new DataColumn("col2") 
    }); 

为了回答您的其他问题,IFColumns不得不在其构造setter和IFDataColumnCollection接受列语法是:

DataTable table = new DataTable() 
{ 
    Columns = new DataColumnCollection(new DataColumn[] 
    { 
     new DataColumn("col1"), 
     new DataColumn("col2") 
    }) 
});