从“System.Object [,]”c#中获取值

Posted

技术标签:

【中文标题】从“System.Object [,]”c#中获取值【英文标题】:Get Values out of "System.Object[,]" c# 【发布时间】:2021-04-18 12:28:32 【问题描述】:

我从这样的 Excel 工作表中收集数据(使用 Interop Excel):

var tmp = WorkSheet.Range["G2", "AG2"].Value2;

现在我的问题是我无法获取数据,因为 tmp 的类型是 object object[,]。如何访问数据?

【问题讨论】:

Convert.ToDouble(tmp[r, c]) 怎么样,rc 是您要访问的行和列索引? 这能回答你的问题吗? How can I quickly up-cast object[,] into double[,]? @Youssef13 如果我尝试这样的事情:` var tmp2 = Convert.ToDouble(tmp[r, c]); ` 我收到一个错误 CS0021 请复制/粘贴错误信息文本。 使用 [] 的索引不能应用于“object”类型的表达式。 CS0021 【参考方案1】:

根据调试器中的映像,所有值都是双精度值,因此您可以安全地转换为双精度值。

var tmp = (object[,])WorkSheet.Range["G2", "AG2"].Value2;
// Create a copy of the array
double[,] doubles = new double[tmp.GetLength(0), tmp.GetLength(1)];
for (int x = 0; x < tmp.GetLength(0); x++)

    for (int y = 0; y < tmp.GetLength(1); y++)
    
        doubles[x, y] = (double)tmp[x, y];
    

// Or inline
double value = (double)tmp[x,y]

【讨论】:

Array.Copy 可能运行良好,并且比循环输入更少。 var doubles = new double[tmp.GetLength(0), tmp.GetLength(1)];Array.Copy(tmp, doubles, tmp.Length); @Youssef13 如果我尝试使用您的代码,我收到错误 CS1061 "object" does not contain a definition for "GetLength". @Lars 考虑先将tmp 转换为object[,]

以上是关于从“System.Object [,]”c#中获取值的主要内容,如果未能解决你的问题,请参考以下文章

未定义或导入 C# 预定义类型“System.Object”

在 Directory<system.String, system.Object> 中按键访问值 - C# Unity Dictionary

c++可以“System::Object obj”定义一个object类吗?

C# - 将列表 System.Object[] 转换为列表 System.Int32[]

C#中的object类深入理解!最好给实例!及其转换!

C#枚举类型的常用操作总结