所有
我已经阅读了此问题的先前答案,找不到任何可以解决我的具体问题的内容。我试图将列中的所有值都放入数组中。这就是我所拥有的,它有效,但我正在努力学习lambdas:
pointCount = myDataTable.Rows.Count;
xData = new double[pointCount];
yData = new double[pointCount];
for (int i = 0; i < pointCount; i++)
{
xData[i] = (double)myDataTable.Rows[i]["XData"];
yData[i] = (double)myDataTable.Rows[i]["YData"];
}
对于我的生活,我无法弄清楚消除循环所需的lambda语法。
感谢您的帮助, - 比尔
答案 0 :(得分:0)
您可以使用Select
获得相同的结果,例如以下基于lambda表达式的结果:
var result = myDataTable.Rows.AsEnumerable()
.Select(x=> new
{
XData = x.Field<double>("XData"),
YData = x.Field<double>("YData")
}).ToArray();
但是这会给你一个匿名对象,其中有两个属性XData
和YData
作为一个对象数组。
您也可以将它们放在单独的数组中,就像您在问题中一样,但它会是矫枉过正,因为我们必须迭代所有集合两次,然后像:
xData = myDataTable.Rows.AsEnumerable()
.Select(x=> x.Field<double>("XData")).ToArray();
yData = myDataTable.Rows.AsEnumerable()
.Select(x=> x.Field<double>("YData")).ToArray();
答案 1 :(得分:0)
试试这个:
{{1}}
使用System.Data.Extensions中的AsEnumerable()使数据表对象成为可枚举的,然后Select查询从数据表中获取每一行,然后x.Field指定列类型(double)和带有字符串值的括号指定列名称,然后通过调用ToArray()将linq集合转换为数组来完成它。希望这会有所帮助。
我不是特别喜欢这个答案,因为我下面的人试图告诉你,你可以在一个选择中完成所有这些,但是正如评论所指出的那样,由于它是匿名对象,他的答案是有缺陷的。为了更好地做到这一点,考虑创建一个包含x和y两个属性的自定义类,然后为自定义类创建一个数组,然后执行linq选择并将值放入数组中每个对象的每个属性中。
答案 2 :(得分:-1)
你不能按原样去做。这些行是DataRowCollection
的实例,它继承InternalDataCollectionBase
。这两种类型都不是显然是 IEnumerable
。
InternalDataCollectionBase
可以实施IEnumerable
,但如果确实如此,则需要投射。然后你应该能够编写这样的LINQ查询:
((IEnumerable)myDataTable.Rows).ForEach(r =>
{
xData[i] = (double)r["XData"];
yData[i] = (double)r["YData"];
}
同样,这取决于InternalDataCollectionBase
是否提供IEnumerable
的明确实现。
我无法回想起ForEach
是否是有效的LINQ扩展。如果不是,那么它就是:
public static void ForEach<T>(this IEnumerable<T> sequence,
Action<T> action)
{
foreach(T item in sequence)
{
action(item);
}
}