在C#中如何实现变量名动态包含另一变量?
在C#中实现动态命名变量并存入数组的解决方案
你好呀!首先得明确一点:C#并不支持直接声明名称中包含动态变量的局部变量(比如你想写的aquiles(x)这种语法是行不通的),因为C#是静态类型语言,变量名需要在编译时就确定下来。不过你的核心需求——把动态创建的Warrior实例存入数组,完全可以通过更简洁的方式实现,甚至不需要单独命名每个实例。
先帮你指出原代码里的几个小问题:
- 数组类型错误:你声明的是
String[] SublimeArray,但要存的是Warrior对象,应该改成Warrior[] SublimeArray - 循环越界:数组长度是5,索引范围是0到4,所以循环条件应该是
x < SublimeArray.Length,而不是x <= SublimeArray.Length,否则会抛出索引越界异常 - 动态变量名的语法错误:
Warrior aquiles(x) = new Warrior();这种写法在C#里不合法
方案1:直接创建实例并存入数组(最适合开放哈希场景)
如果你的目标只是把Warrior实例存入数组用于开放哈希实现,其实根本不需要单独命名每个实例,直接在循环里创建并存入即可:
class Warrior { public string weapon; public string armor; } // 正确声明存储Warrior对象的数组 Warrior[] SublimeArray = new Warrior[5]; for(int x = 0; x < SublimeArray.Length; x++) { // 直接创建Warrior实例并赋值给数组对应索引 SublimeArray[x] = new Warrior(); }
这样数组的每个位置就都有一个独立的Warrior实例了,完全满足你期望的效果——和你注释里写的aquiles1、aquiles2存入数组是一样的,只是不需要单独给每个实例命名,因为你可以通过数组索引SublimeArray[0]、SublimeArray[1]来访问它们,这也更符合哈希表通过索引操作的逻辑。
方案2:用字典映射动态名称和实例(如果确实需要命名访问)
如果你确实需要通过类似aquiles1、aquiles2这样的名称来访问实例,可以用Dictionary<string, Warrior>来存储名称和实例的映射,同时把实例存入数组:
using System.Collections.Generic; class Warrior { public string weapon; public string armor; } Warrior[] SublimeArray = new Warrior[5]; // 创建字典用于存储名称和Warrior实例的映射 Dictionary<string, Warrior> warriorMap = new Dictionary<string, Warrior>(); for(int x = 0; x < SublimeArray.Length; x++) { Warrior newWarrior = new Warrior(); // 存入数组 SublimeArray[x] = newWarrior; // 生成动态名称(比如aquiles1、aquiles2...)并存入字典 string warriorName = $"aquiles{x + 1}"; warriorMap.Add(warriorName, newWarrior); } // 之后可以通过名称从字典中获取实例 Warrior aquiles1 = warriorMap["aquiles1"]; Warrior aquiles3 = warriorMap["aquiles3"];
针对开放哈希的补充说明
在开放哈希(开放寻址)的实现中,数组本身就是核心存储结构,我们通常是通过哈希计算得到索引,然后直接操作数组对应位置的元素,所以方案1的写法是最直接高效的,不需要额外的字典来维护名称映射。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

