非Bash环境下,如何用变量值拼接数组名并访问数组?
如何通过动态生成的名称访问c0、c1这类数组?
嘿,我完全明白你想实现的效果——你希望通过拼接字符串得到的名字,直接访问那些预先定义好的c0、c1数组,但静态编程语言(从你的语法和报错来看,应该是C#)并不支持这种“字符串转变量名”的动态访问方式,这就是为啥你会碰到"Project" does not contain a definition for "name"的错误。
下面给你几个实用的解决方案,按推荐程度排序:
1. 使用数组的数组(最推荐、最简洁)
把你的c0、c1这些数组统一放进一个二维数组或者数组列表里,这样直接通过索引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




