C#Lambda用于将DataTable行分配给数组

时间:2018-02-16 18:10:26

标签: c# lambda

所有

我已经阅读了此问题的先前答案,找不到任何可以解决我的具体问题的内容。我试图将列中的所有值都放入数组中。这就是我所拥有的,它有效,但我正在努力学习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语法。

感谢您的帮助, - 比尔

3 个答案:

答案 0 :(得分:0)

您可以使用Select获得相同的结果,例如以下基于lambda表达式的结果:

var result = myDataTable.Rows.AsEnumerable()
             .Select(x=> new 
                      { 
                          XData = x.Field<double>("XData"),
                          YData = x.Field<double>("YData")
                       }).ToArray();

但是这会给你一个匿名对象,其中有两个属性XDataYData作为一个对象数组。

您也可以将它们放在单独的数组中,就像您在问题中一样,但它会是矫枉过正,因为我们必须迭代所有集合两次,然后像:

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);
    }
}