C# 我需要有效的扩展方法来获取DataRow作为列表<;双倍>;
我需要DataRow的extensim方法,它返回双精度列表 我假设我的数据行只包含双数据类型 我试过这样的方法: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 {
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。我必须阅读这些索引器属性。非常感谢。