You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

非Bash环境下,如何用变量值拼接数组名并访问数组?

如何通过动态生成的名称访问c0、c1这类数组?

嘿,我完全明白你想实现的效果——你希望通过拼接字符串得到的名字,直接访问那些预先定义好的c0c1数组,但静态编程语言(从你的语法和报错来看,应该是C#)并不支持这种“字符串转变量名”的动态访问方式,这就是为啥你会碰到"Project" does not contain a definition for "name"的错误。

下面给你几个实用的解决方案,按推荐程度排序:

1. 使用数组的数组(最推荐、最简洁)

把你的c0c1这些数组统一放进一个二维数组或者数组列表里,这样直接通过索引i就能访问对应的数组,完全不需要拼接字符串:

// 先定义好你的各个数组
double[] c0 = { 1.2, 3.4, 5.6 };
double[] c1 = { 7.8, 9.0, 2.3 };
double[] c2 = { 4.5, 6.7, 8.9 };

// 将它们打包成一个数组的数组
double[][] cCollections = new double[][] { c0, c1, c2 };

int i = 0; // 这个i可以在循环里按需修改
double a = cCollections[i][0]; // 比如访问第i个数组的第一个元素

这种方式类型安全、性能好,是处理这类场景的首选。

2. 使用字典映射(适合非连续命名或需要自定义键的场景)

如果你的数组命名不是连续的数字,或者需要更灵活的键值对应关系,可以用Dictionary来存储数组名和数组的映射:

using System.Collections.Generic;

// 初始化字典,绑定数组名和对应的数组
Dictionary<string, double[]> cDict = new Dictionary<string, double[]>
{
    { "c0", c0 },
    { "c1", c1 },
    { "c2", c2 }
};

int i = 1;
string name = $"c{i}";
// 注意:要确保字典里存在对应的key,不然会抛出KeyNotFoundException
double a = cDict[name][1]; // 访问c1数组的第二个元素

3. 反射(仅在特殊场景下使用)

反射可以实现动态获取变量,但它性能差、可读性低,还容易出错,除非你有特殊需求,否则不建议用。示例代码如下:

using System.Reflection;

// 假设这些数组是当前类的公共实例字段
int i = 0;
string fieldName = $"c{i}";
// 获取字段信息
FieldInfo field = this.GetType().GetField(fieldName, BindingFlags.Public | BindingFlags.Instance);
// 转换为对应的数组类型
double[] targetArray = (double[])field.GetValue(this);
double a = targetArray[2];

为什么你的原代码会报错?

在编译阶段,name只是一个普通的字符串变量,编译器根本不知道你想把它当成变量名来使用——它会去寻找名为name的类成员,而你并没有定义这个成员,所以就抛出了找不到定义的错误。静态语言不像Bash这类脚本语言,支持动态解析变量名,所以必须用上面这些方式来实现类似的效果。

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

火山引擎 最新活动