拥有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
的方法之间的区别。
答案 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();