1

由于我在上一个问题中无法很好地解释并且我没有得到一个可以让我满意的答案,所以我决定开一个新的。
直截了当,我基本上想要做的是编译一个变量(它持有的值)作为代码的一部分(特别是在我的情况下引用另一个变量)
假设我有:

int var_1, var_2, var_3 ... var_10;
for (int i = 1; i <= 10; i++)
{
    var_%i%=20; //if i is 1, then var_1's value will be set to 20, if i is 2, then var_2's value will be set to 20. So basically this loop sets the value of var_1 .. var_10 to 20
}

如果在任何情况下后者不清楚,我可以用更简单的方式解释。

int var_5;
int SomeOtherVar = 5;
var_%SomeOtherVar% = 10; // so var_5 (where 5 is the value of SomeOtherVar) is set to 10

这是可行的,如果可行,方法是什么?

4

4 回答 4

4

不,你不能那样做,你为什么不使用数组?

    int[]  array = new int[3];

    for (int i = 0; i < array.Length; ++i)
    {
        array[i] = 20;
    }

希望能帮助到你。

于 2012-12-30T22:35:04.543 回答
0

这是不可行的。请改用数组。类型是int[],但我建议您阅读有关数组的教程以了解如何创建和使用它们。

于 2012-12-30T22:33:36.053 回答
0

我想不出你需要这样做的情况。如果您希望针对连续的数字列表存储值,请使用数组。否则,您可以使用字典。例如,要在您的问题中存储 "var1" = 20, "var2" = 20 ,您可以这样做:

Dictionary<string, int> dict = new Dictionary<string, int>();

for (int i = 1; i <= 10; i++)
{
    dict.Add("var" + i.ToString(), 20);
}

一些使用示例:

dict["var1"]              // 20
dict["var2"]              // 20
dict.ContainsKey("var3")  // true
dict.ContainsKey("var99") // false

注意:我将字符串“var”与循环中的 int 连接只是为了演示您可以使用任意字符串作为键来存储/查找值。在这种情况下,这样做有点奇怪,您可能最好坚持使用普通数组,但我的示例显示了字典如何使用更复杂的键。

于 2012-12-30T22:43:08.493 回答
0

如果你想绕过静态类型检查并且你想创造一些编码恐惧,你可以使用ExpandoObject结合dynamic关键字。不会让您在范围内设置变量,但从技术上讲,您可以声明自己的变量。请注意,在我的示例中,我将其转换为,IDictionary<string, object>因为我在运行时从字符串创建其成员的名称。以下方法所做的是创建 20 个成员并将它们的值从 0 分配到 19。

static dynamic SetVariables(IEnumerable<int> range)
{
    const string variableName = "var_";
    var expandoDictionary = new ExpandoObject() as IDictionary<string, object>;
    foreach (var i in range)
        expandoDictionary[variableName + i] = i;
    return expandoDictionary;
}

然后,您可以通过以下方式轻松访问成员:

var container = SetVariables(Enumerable.Range(0, 20));
var value13 = container.var_13;

请注意,我dynamic推荐这种用法,我会尽可能远离。但是,为了解决问题,这可以看作是一种不安全但部分的解决方案。

于 2012-12-31T06:28:05.160 回答