C# 我需要有效的扩展方法来获取DataRow作为列表<;双倍>;

C# 我需要有效的扩展方法来获取DataRow作为列表<;双倍>;,c#,extension-methods,datarow,C#,Extension Methods,Datarow,我需要DataRow的extensim方法,它返回双精度列表 我假设我的数据行只包含双数据类型 我试过这样的方法: public static List<double> ToListOfDouble(this DataRow datarow) { List<double> retList = new List<double>(); foreach (object val in datarow) // error here {

我需要DataRow的extensim方法,它返回双精度列表

我假设我的数据行只包含双数据类型

我试过这样的方法:

public static List<double> ToListOfDouble(this DataRow datarow)
{
    List<double> retList = new List<double>();

    foreach (object val in datarow) // error here
    {
        retList.Add((double)val);
    }

    return retList;
}
公共静态列表ToListOfDouble(此数据行数据行)
{
List retList=新列表();
foreach(datarow中的object val)//此处出错
{
retList.Add((双)val);
}
返回列表;
}
但我有一个错误:

foreach语句无法对类型为的变量进行操作 “System.Data.DataRow”因为“System.Data.DataRow”不包含 “GetEnumerator”的公共定义

是要迭代的属性(而不是数据行本身)。

一个简单选项:

return datarow.ItemArray.Cast<double>().ToList();
返回datarow.ItemArray.Cast().ToList();
不过,这可能涉及到一份不必要的副本。在数据复制方面效率稍高,但在验证等方面效率可能较低:

int count = row.Table.Columns.Count;
var ret = new List<double>(count);
for (int i = 0; i < count; i++)
{
    ret.Add((double) datarow[i]);
}
return ret;
int count=row.Table.Columns.count;
var ret=新列表(计数);
for(int i=0;i

如果您认为这两个选项对您的应用程序很重要,您应该对它们进行基准测试,以检查它们的性能。

这两个选项的效率如何?那
for
循环看起来效率不高,但也许我错了?@Kamil:那么,在列的数量上,它将是O(N)。不管你做什么,我看不出你怎么能比这更快。
for
循环避免了任何额外的数据拷贝(与
ItemArray
不同)。它在什么方面“看起来”不高效?你有证据表明这段代码对你的应用程序的整体性能有重要影响吗?我担心性能,因为我会用它来操作可能包含1M行x50列的数据表。这是神经网络学习数据。@Kamil:好吧,这建议你应该测试一下。。。但我仍然认为这一部分与程序的其余部分相比微不足道。(你有没有办法避免把它放到
数据表中?)我的英语不是很好,我不确定我是否正确理解括号中的句子。你在问我是否可以用数组或其他方法来代替DataTable以获得更好的性能?但类似的方法是:
row[c]
其中
c
是列索引。。。为什么?@Kamil因为DataRow有索引器属性。索引和迭代是独立的概念,每个类都需要单独提供。OK。我必须阅读这些索引器属性。非常感谢。