将Datatable列转换为数组数组

时间:2014-02-02 10:25:32

标签: c# arrays highcharts

拥有DataView tmp,我需要从两列tmp创建一个数组数组(可能这不是c#中的正确术语,我是新手)到DotNet.Highcharts。最终结构应该是这样的:

 [[5, 2], [6, 3], [8, 2]]

首先,我使用了这段代码:

Object[] result = new object[tmp.Count];
result = tmp.Table
            .AsEnumerable()
            .Select(row => new Object[] { row.Field<DateTime>("DATE"),
                                            Convert.ToDouble(row.Field<string>("VALUE"))})
            .ToArray();

当我尝试用result替换Point的元素(以定义自定义标记,例如)时出现问题:

if (something[k] == "TRUE") // if for a given row a generic condition is true
{
    result[k] = new DotNet.Highcharts.Options.Point
    {
        X = Tools.GetTotalMilliseconds((DateTime)tmp[k].Row["DATE"]),
        Y = Convert.ToInt32(tmp[k].Row["VALUE"]),
        Marker = new PlotOptionsSeriesMarker
        {
            Symbol = "url(/Proj/images/cross.png)"
        }
    };
}

在运行时我得到:A first chance exception of type 'System.ArrayTypeMismatchException' occurred in App_Web_pz3kxbru.dll

我找到了修补此功能来创建result

Object[] result = new object[tmp.Count];
for (int j = 0; j < tmp.Count; j++)
{
      result [j] = new object[] { (DateTime)tmp[j].Row["DATE"],
                                    Convert.ToDouble(tmp[j].Row["VALUE"])};
}

现在一切正常。但是我对实际做的事情没有任何线索......你能解释一下我用来获取result的方法之间的区别。

1 个答案:

答案 0 :(得分:1)

我能注意到的唯一区别是,Convert.ToDouble在第一种方法中:

.Select(row => new Object[] { row.Field<DateTime>("DATE"),
                                            Convert.ToDouble(row.Field<string>("VALUE"))})
第二个

Convert.ToInt32

new object[] { (DateTime)tmp[j].Row["DATE"],
                                    Convert.ToInt32(tmp[j].Row["VALUE"])};

更新:

第一种方法创建一个新数组,将原始数组(对象数组Object[])替换为新数组,即“数组数组”(Object[][]),从而导致问题( co-variant array problem)。

第二种方法不会创建新数组,而是使用数组填充原始对象数组中的每个插槽。所以在这种情况下,result仍然是对象的数组,不会被改为'数组数组',因此可以避免异常。

如果您喜欢LINQ方法,这样做(仍然需要一个计数器变量):

Object[] result = new object[tmp.Count];
int i = 0;
result = tmp.Table
            .AsEnumerable()
            .ForEach(row => result[i++] = new Object[] { row.Field<DateTime>("DATE"),
                                            Convert.ToDouble(row.Field<string>("VALUE"))});

或者更好的是,只需将对象数组转换为对象:

result = tmp.Table
            .AsEnumerable()
            .Select(row => (Object)new Object[] { row.Field<DateTime>("DATE"),
                                            Convert.ToDouble(row.Field<string>("VALUE"))})
            .ToArray();