C# 如何对变量使用索引

C# 如何对变量使用索引,c#,C#,我有一个列表,目前我通过以下方式向其中添加项目: public GameObject object1 = new GameObject("Example Data"); public GameObject object2 = new GameObject("Example Data"); public GameObject object3 = new GameObject("Example Data"); public GameObject object4 = new GameObject("E

我有一个列表,目前我通过以下方式向其中添加项目:

public GameObject object1 = new GameObject("Example Data");
public GameObject object2 = new GameObject("Example Data");
public GameObject object3 = new GameObject("Example Data");
public GameObject object4 = new GameObject("Example Data");
public GameObject object5 = new GameObject("Example Data");
public GameObject object6 = new GameObject("Example Data");
public GameObject object7 = new GameObject("Example Data");
public GameObject object8 = new GameObject("Example Data");
public GameObject object9 = new GameObject("Example Data");
public GameObject object10 = new GameObject("Example Data");
List<GameObject> Objects = new List<GameObject>();

Objects.Add(object1);
Objects.Add(object2);
Objects.Add(object3);
Objects.Add(object4);
Objects.Add(object5);
Objects.Add(object6);
Objects.Add(object7);
Objects.Add(object8);
Objects.Add(object9);
Objects.Add(object10);

我建议使用for循环。循环执行
i
次,创建一个新对象并将其添加到列表中

for(int i = 0; i < 10; i++)
{
    GameObject ob = new GameObject("Example Data " + i);
    Objects.Add(ob);
}
for(int i=0;i<10;i++)
{
GameObject ob=新GameObject(“示例数据”+i);
对象。添加(ob);
}

将字符串转换为变量名并非易事,但根据您的尝试,您可以通过以下方式完全消除
object1
变量:

// Personally I'd use a simple for loop instead of this 
foreach (var number in Enumerable.Range(1, 10))
{
    Objects.Add(new GameObject("Example Data"));
}

编辑:使用1..10的范围会在将来的某个地方让你感到困惑。在C#中,一切都是基于0的。只要接受它,不要假装它不是…

为了使用动态生成的名称读取私有字段,您需要编写一个特殊函数,通过反射读取它。下面是我将如何编写这样一个函数:

public static object GetFieldValue(this object input, string name)
{
    return input
        .GetType()
        .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
        .ToList()
        .Where(f => f.Name == name)
        .Single()
        .GetValue(input);
}
然后您可以这样使用它:

for (int i = 1; i <= 10; i++)
{
    string fieldName = "object" + i.ToString();
    var o = this.GetFieldValue(fieldName);
    objects.Add(o);
}
如果需要从列表中取出一个实例,只需按索引引用它(尽管可能需要减去1,因为它是基于0的):

另一种处理方法,特别是如果这些实例中的每一个都在某种程度上是唯一的,则需要使用字典:

Dictionary<string, GameObject> objects = new Dictionary<string, GameObject>();
objects["Player"] = new GameObject("I am a player");
objects["Enemy"] = new GameObject("I am an enemy");
objects["NPC"] = new GameObject("I am a hapless bystander");
如果您需要立即处理所有东西(例如游戏结束):


通常,如果您发现自己在变量名中添加了数字,那么您可能在设计中犯了错误。几乎总是最好将它们放入数组、列表或其他数据结构中,以包含多个实例。

反射是可能的

public class MyClass
{
    public GameObject object1 = new GameObject("g1");
    public GameObject object2 = new GameObject("g2");
    public GameObject object3 = new GameObject("g3");

    public void AddObject()
    {
        List<GameObject> list = new List<GameObject>();

        for (int i = 1; i <= 3; i++)
        {
            var o = this.GetType().GetField($"object{i}").GetValue(this) as GameObject;    
            list.Add(o);
        }           
    }
}
公共类MyClass
{
公共游戏对象object1=新游戏对象(“g1”);
公共游戏对象对象2=新游戏对象(“g2”);
公共游戏对象对象3=新游戏对象(“g3”);
public void AddObject()
{
列表=新列表();

对于(int i=1;i你从哪里得到这些对象?请参见edit如果你喜欢
for
循环,为什么你建议
Enumerable.Range
?@tym32167,因为这是OP在其原始代码中的内容。@tym32167不,我是说我会以一种更简单的方式来做。OP如何循环与问题无关,所以让它保持原样就容易了我想这是一个有用的提示,“这个领域可以改进”,但不需要为他们重写所有的OPs内容-我没有为此得到报酬;-)非常感谢你非常详细的回答!
var object1 = Objects[0];
Dictionary<string, GameObject> objects = new Dictionary<string, GameObject>();
objects["Player"] = new GameObject("I am a player");
objects["Enemy"] = new GameObject("I am an enemy");
objects["NPC"] = new GameObject("I am a hapless bystander");
objects["Player"].Dispose();
objects.Remove("Player");
foreach (var o in objects) o.Dispose();
objects.Clear();
public class MyClass
{
    public GameObject object1 = new GameObject("g1");
    public GameObject object2 = new GameObject("g2");
    public GameObject object3 = new GameObject("g3");

    public void AddObject()
    {
        List<GameObject> list = new List<GameObject>();

        for (int i = 1; i <= 3; i++)
        {
            var o = this.GetType().GetField($"object{i}").GetValue(this) as GameObject;    
            list.Add(o);
        }           
    }
}