Как настроить коллекцию inline?

Например:

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

6 ответов

Решение

Вы говорите о функции Collection Initializer, добавленной в C# 3. Это делается так:

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

Это не вызывает конструктор коллекции, он использует коллекцию, которая уже существует в DataTable.

Это сокращение от Columns.Add(), поэтому для него не требуется, чтобы в столбцах был установщик.

Вы были так близки с кодом в вашем вопросе!

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

Есть две причины, почему это не сработает:

1) Columns свойство доступно только для чтения 2) DataColumnCollection Класс не имеет конструктора, который принимает коллекцию столбцов для его инициализации.
Лучшее, что вы можете сделать, это создать таблицу в одну строку и добавить столбцы в другую:

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

Чтобы ответить на ваш другой вопрос, ЕСЛИ Columns был сеттер и ЕСЛИ DataColumnCollection принимает столбцы в своем конструкторе, синтаксис будет:

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

Вам, вероятно, нужно удалить паретезы вокруг инициализатора коллекции для DataColumnCollectionи удалите непревзойденный, последний )

Это синтаксические проблемы. Основные проблемы заключаются в том, что Columns свойство не имеет установщика, а DataColumnCollection не имеет публичного конструктора

По сути, вы должны создать экземпляр, а затем вызвать .Columns.Add(),

Если это то, что вам нужно сделать в вашем коде, вы можете создать вспомогательные классы, которые обеспечат вам более дружественный синтаксис:

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

Вы не можете использовать этот синтаксис, так как свойство Columns доступно только для чтения. Я бы использовал технику, предложенную Гейбом.

Класс DataColumnCollection не имеет конструктора, поэтому вы не можете создать экземпляр вручную. Сообщение об ошибке компилятора должно быть самоочевидным, говоря что-то вроде:

Тип 'System.Data.DataColumnCollection' не имеет определенных конструкторов

Вы можете добавить столбцы к DataTable.Columns Сбор с помощью Add() метод:

DataTable table = new DataTable();
table.Columns.Add(new DataColumn("col1"));
table.Columns.Add(new DataColumn("col2"));
Другие вопросы по тегам