繁体   English   中英

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

[英]C# Lambda for assigning DataTable rows to array

全部,

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

谢谢你的帮助,-比尔

您可以使用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();

尝试这个:

xData = myDataTable.AsEnumerable().Select(x => x.Field<double>("XData")).ToArray();

yData = myDataTable.AsEnumberable().Select(x => x.Field<double>("YDate")).ToArray();

您使用 System.Data.Extensions 中的 AsEnumerable() 使数据表对象成为可枚举的,然后 Select 查询从数据表中抓取每一行,然后 x.Field 指定列类型(双精度),字符串值后面的括号指定列名称,然后完成它你调用 ToArray() 将 linq 集合转换为数组。 希望这可以帮助。

我不是特别喜欢这个答案,因为我下面的人试图向您展示您可以在一次选择中完成所有这些,但正如评论指出的那样,他的答案是有缺陷的,因为它是匿名对象。 为了使这更好,考虑为 x 和 y 创建一个具有两个属性的自定义类,然后为自定义类创建一个数组,然后执行 linq Select 并将值放入数组中每个对象的每个属性中。

您将无法按原样进行。 这些行是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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM