C# 对变量和/或表单对象的引用数组

Dan*_*din 0 c# arrays reference func

我想做的是拥有一个对变量的引用数组。我的意思是相当于一个指向 int 的指针的 C 数组(例如)。

示例:(!!不是真正的代码!!)

int a = 4;
int b = 5;
int c = 6;
List<ref int> tmp = new List<ref int>();

tmp.Add(ref a);
tmp.Add(ref b);
tmp.Add(ref c);

tmp[0] = 16;
tmp[1] = 3;
tmp[2] = 1000;

Console.Writeline(tmp[0] + " " + a); // 16 16
Console.Writeline(tmp[1] + " " + b); // 3 3
Console.Writeline(tmp[2] + " " + c); // 1000 1000
Run Code Online (Sandbox Code Playgroud)

我的案例的具体情况:我有一个与字典中的键相对应的字符串列表。我想我想要的是一个元组列表,其中 Type1 是对 int 或 string 的引用,Type2 是对 Textbox 的引用。

我将迭代这个列表,使用字符串从字典中获取值(并使用该数据进行处理),然后将结果存储到 Type1 中。最终我将从这些 Type1 变量引用中获取数据并将其数据复制到相应的 Type2 文本框。

这就是我认为我想做的事情的要点。如果有人认为我的方法过于复杂,我会说我需要保留文本框,因为它们很遗憾,所以我不能只创建一个数组并迭代它。最好也将 Type1 变量分开,尽管不是很有必要。

现在,通过阅读,我认为 Func<> 看起来是最适合我想要的东西,所以我尝试使用以下内容(使用 Type1,作为对象,因为它需要处理整数和字符串)

List<Tuple<string, Func<object>, Func<object>>>
Run Code Online (Sandbox Code Playgroud)

但我不确定如何使用它来获取对变量的引用。

Ada*_*son 5

具体要求的是不可能的;更合适的(并且具有实际工作的便利!)是围绕您想要做的事情设计一个类结构。

例如,这样的事情:

public class MyObject // Name it appropriately
{
    public object Value { get; set; }
    public string Key { get; set; }
    public TextBox TextBox { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后,在您的代码中,您可以执行类似于此的操作...

Dictionary<string, object> values = ...
List<MyObject> objects = ...

foreach(var item in objects)
{
    item.Value = values[item.Key];

    // process your data

    item.TextBox = item.Value.ToString();
}
Run Code Online (Sandbox Code Playgroud)

显然,这只是一个粗略的设计,这里的类只不过是一个数据传输容器。例如,您可以通过使用属性的 setter自动Value设置值来使类“更智能” TextBox。但这应该能让您大致了解如何以面向对象的方式完成类似的事情。

编辑这是您的示例的外观。

MyObject a = new MyObject() { Value = 4 };
MyObject b = new MyObject() { Value = 5 };
MyObject c = new MyObject() { Value = 6 };
List<MyObject> tmp = new List<MyObject>();

tmp.Add(a);
tmp.Add(b);
tmp.Add(c);

tmp[0].Value = 16;
tmp[1].Value = 3;
tmp[2].Value = 1000;

Console.Writeline(tmp[0].Value.ToString() + " " + a.Value.ToString()); // 16 16
Console.Writeline(tmp[1].Value.ToString() + " " + b.Value.ToString()); // 3 3
Console.Writeline(tmp[2].Value.ToString() + " " + c.Value.ToString()); // 1000 1000
Run Code Online (Sandbox Code Playgroud)