Установить значения всего столбца данных из массива или списка

1

У меня есть DataTable с 3 столбцами: URL [string], Date [DateTime], DestinationFile [string]

Используя метод, я подключаюсь к Интернету и заполняю первые два столбца (URL, Дата) со списком URL-адресов и датой их загрузки

Используя другой метод, мне нужно заполнить третий столбец (DestinationFile) строковым массивом, включающим конкретный путь для каждого файла. Строковый массив имеет тот же размер, что и количество строк DataTable.

Можно ли заполнить третий столбец DataTable массивом строк (в данном случае, но может быть любого типа)?

Теги:
arrays
list
ado.net
datatable

1 ответ

3
Лучший ответ

Там нет никакого способа сделать это непосредственно в один шаг, так что вам придется изменить значения вручную в цикле, используя Ряды коллекцию DataTable и индексатор имущества в DataRow:

DataTable dt = ...
String[] destinationFiles = ...
Int32 destinationFileColumnIndex = 2;

if (dt.Rows.Count != destinationFiles.Length)
   throw new Exception("Lengthes are inconsistent");

for (int i = 0; i < destinationFiles.Length; i++)
{
    dt.Rows[i][destinationFileColumnIndex] = destinationFiles[i];
}

Если destinationFiles имеет тип, отличный от String, то необходимо изменить либо столбец DataTable, чтобы иметь соответствующий тип, либо вам нужно преобразовать значения этого типа в строку.

Чтобы достичь этого, вы должны либо вызвать .ToString(), если он правильно реализован:

SomeType[] destinationFiles = ...
// ...
    dt.Rows[i][destinationFileColumnIndex] = destinationFiles[i].ToString();

или вручную сформировать строку для установки:

SomeType cur = destinationFiles[i];
dt.Rows[i][destinationFileColumnIndex] = String.Format("{0} and {1}",
     cur.Prop1,
     cur.Prop2);

РЕДАКТИРОВАТЬ:

Прямой метод, к сожалению, отсутствует, но существует такая вещь, как методы расширения:

public static class DataColumnExtensions
{
    // Will work with both the arrays and lists
    public static void SetValues<T>(this DataColumn column, IList<T> values)
    {
        if (column == null)
            throw new ArgumentNullException("column");
        if (values== null)
            throw new ArgumentNullException("values");

        DataTable dt = column.Table;             

        if (dt.Rows.Count != values.Count)
             throw new Exception("Lengths are inconsistent");

        for (int i = 0; i < values.Count; i++)
        {
            dt.Rows[i][column] = values[i];
        }
    }
}

и используйте его так:

dt.Columns[2].SetValues(new String[] {....});

Просто поместите его в то же пространство имен, что и ваш код, или, как лучше, поместите его в какое-то подходящее пространство имен и сделайте using AppropriatelyNamedNamespace; только когда вам это нужно.

  • 0
    Спасибо, это решило проблему. Жаль, что нет прямого способа загрузить столбец!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню