You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中OPC DA返回二维数组打印截断及索引访问问题

解决OPC DA订阅中二维数组的访问与完整打印问题

一、解决索引访问报错(CS0021)

e.Vtq.Value的类型是object,编译器无法识别它是二维数组,直接用索引会报错。需要先将其转换为object[,]类型,再进行索引访问:

public void func_ItemChanged(object sender, EasyDAItemChangedEventArgs e)
{            
    if (e.Succeeded)
    {           
        // 先判断并转换为二维object数组
        if (e.Vtq.Value is object[,] twoDArray)
        {
            // 正常通过索引访问元素
            object firstElement = twoDArray[0, 0];
            Console.WriteLine($"[0,0]元素: {firstElement ?? "null"}");

            // 如果知道元素是特定类型(比如string),可直接强转
            if (twoDArray[0, 3] is string statusMsg)
            {
                Console.WriteLine($"状态信息: {statusMsg}");
            }
        }
    }
}

二、完整打印二维数组(避免截断)

默认Console.WriteLine(e.Vtq.Value)会截断长数组内容,需要手动遍历所有元素并拼接成完整字符串:

public void func_ItemChanged(object sender, EasyDAItemChangedEventArgs e)
{            
    if (e.Succeeded && e.Vtq.Value is object[,] twoDArray)
    {           
        int rowCount = twoDArray.GetLength(0);
        int colCount = twoDArray.GetLength(1);
        
        // 用StringBuilder高效拼接内容
        var sb = new StringBuilder();
        sb.AppendLine($"数组尺寸: {rowCount}行 × {colCount}列");
        sb.AppendLine("{");

        for (int i = 0; i < rowCount; i++)
        {
            sb.Append("  {");
            for (int j = 0; j < colCount; j++)
            {
                // 处理null元素,避免空引用
                sb.Append(twoDArray[i, j]?.ToString() ?? "null");
                if (j < colCount - 1)
                    sb.Append(", ");
            }
            sb.Append("}");
            if (i < rowCount - 1)
                sb.AppendLine(",");
        }

        sb.AppendLine("}");
        Console.WriteLine(sb.ToString());
    }
}

整合后的完整方法

把两个需求合并到同一个方法里:

public void func_ItemChanged(object sender, EasyDAItemChangedEventArgs e)
{            
    if (e.Succeeded && e.Vtq.Value is object[,] twoDArray)
    {           
        // 1. 访问指定索引元素
        object element = twoDArray[0, 0];
        Console.WriteLine($"[0,0]元素值: {element ?? "null"}");

        // 2. 完整打印整个二维数组
        int rowCount = twoDArray.GetLength(0);
        int colCount = twoDArray.GetLength(1);
        var sb = new StringBuilder();
        sb.AppendLine($"[{rowCount}, {colCount}] {{");

        for (int i = 0; i < rowCount; i++)
        {
            sb.Append("  {");
            for (int j = 0; j < colCount; j++)
            {
                sb.Append(twoDArray[i, j]?.ToString() ?? "null");
                if (j < colCount - 1)
                    sb.Append(", ");
            }
            sb.Append("}");
            if (i < rowCount - 1)
                sb.AppendLine(",");
        }

        sb.AppendLine("}");
        Console.WriteLine(sb.ToString());
    }
}

内容的提问来源于stack exchange,提问作者Mdarende

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:53:15