Как получить значение столбца typeof (любой массив) из DataRow - PullRequest
0 голосов
/ 19 июня 2020

У меня есть DataTable, который содержит 4 столбца:

DataColumn[] dc = new DataColumn[]
            {
                new DataColumn("Programname",typeof(string)),
                new DataColumn("X-Coordinate",typeof(double[])),
                new DataColumn("Y-Coordinate",typeof(double[])),
                new DataColumn("Z-Coordinate",typeof(double[])),
            };

Затем я создал одну строку:

DataRow row = ProgramDataSet.Tables["Standard"].NewRow();
            row["Programname"] = "1";
            row["X-Coordinate"] = new double[]{ 1.23, 4.56, 7.89 };
            row["Y-Coordinate"] = new double[]{ 123, 451, 7.89 };
            row["Z-Coordinate"] = new double[] { 0.00, 1.11, 13.13 };    
 ProgramDataSet.Tables["Standard"].Rows.Add(row);

И теперь я хочу получить значение из этой строки:

foreach (DataTable table in ProgramDataSet.Tables)
            {                    
                foreach (DataRow dr in table.Rows)
                {
                    Console.Write("{0} {1} {2} {3}", dr.ItemArray[0], dr.ItemArray[1], dr.ItemArray[2], dr.ItemArray[3]);    
                }
                Console.WriteLine();
            }

В качестве вывода я получаю: 1 System.Double[] System.Double[] System.Double[]

вместо: 1 1,23 4,56 7,89 и т. Д. c

Как я могу получить значение из dr.ItemArray [1] , dr.ItemArray [2], dr.ItemArray [3]?

Заранее спасибо

Ответы [ 5 ]

1 голос
/ 19 июня 2020

Вы можете получить Programname как dr["Programname"], но для X-Coordinate вы можете преобразовать dr["X-Coordinate"] в double[] и использовать string. Присоединитесь к , чтобы объединить элементы массивы, такие как string для console.Write(), например, следующий код:

Console.Write("{0} {1} {2} {3}", dr["Programname"], string.Join(",", (double[])dr["X-Coordinate"]), 
                    string.Join(",", (double[])dr["Y-Coordinate"]), string.Join(",", (double[])dr["Z-Coordinate"]));

Обновить согласно комментарию

int columnIndex = 0;
var columns = ProgrammsForLaser.ProgramDataSet.Tables["Standard"].Columns;
dataGridView1.ColumnCount  = columns.Count;

foreach (DataColumn dc in columns) 
{ 
    dataGridView1.Columns[columnIndex].Name = dc.ColumnName;
    columnIndex++;
} 
foreach (DataRow dr in ProgrammsForLaser.ProgramDataSet.Tables["Standard"].Rows) 
{ 
    string[] row = { dr[0].ToString(), string.Join(",", (double[])dr[1]), string.Join(",", (double[])dr[2]), string.Join(",", (double[])dr[3]) };
    dataGridView1.Rows.Add(row); 
}

Надеюсь, вы найдете это полезным .

1 голос
/ 19 июня 2020

Предлагаю создать вспомогательный метод.

string Join(object value)
{
    if (value is double[] array)
    {
        return string.Join(",", array);
    }
    return value.ToString();
}

Используйте его следующим образом.

foreach (DataRow dr in table.Rows)
{
    Console.Write("{0} {1} {2} {3}",
        Join(dr[0]), Join(dr[1]), Join(dr[2]), Join(dr[3])
    );
}
0 голосов
/ 19 июня 2020

Прежде всего, у вас странная структура данных. У вас есть столбцы, содержащие несколько значений (поскольку они содержат массивы double). Это структура, которую будет очень сложно сохранить в реальной базе данных и даже представить пользователям. -Coordinate-1, X-Coordinate-2 ... каждый из которых будет содержать одно двойное значение. Таким образом, простая итерация предоставит вам всю необходимую информацию, и вы можете легко отправить ее в обычную базу данных.

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

Если по какой-либо причине вы не можете переключиться на одну из этих двух форм, вам необходимо выполнить итерацию в каждом массиве для отображения значений. Поскольку код может стать довольно уродливым, хорошим способом было бы создать вспомогательный метод, который был бы расширением:

public static class DoubleArrayExtension
{
    public static string PrintArray(this double[] array)
    {
        return string.Join(array, ", ");
    }
}

Затем вы должны использовать его следующим образом:

Console.Write("{0} {1} {2} {3}", 
                dr.ItemArray[0], 
                ((double[])dr.ItemArray[1]).PrintArray(), 
                ((double[])dr.ItemArray[2]).PrintArray(), 
                ((double[])dr.ItemArray[3]).PrintArray());
0 голосов
/ 19 июня 2020

Вы получаете правильный результат. Если вы заметили dr.ItemArray [1] / dr.ItemArray [2] / dr.ItemArray [3] , возвращаемые типы имеют тип double []. Чтобы распечатать элементы, вам нужно выполнить итерацию.

Если вы передаете dr.ItemArray [1] в консоли, по умолчанию метод tostring () вызывается для типа, чтобы вернуть его полное имя, вот что вы получаете в качестве вывода.

U следует попробовать что-то вроде получения значений

foreach(double value in  (dr.ItemArray[1] as double[])){

}
0 голосов
/ 19 июня 2020

вы можете получить доступ так,

dr["Programname"] или dr[0]

...