c#如何像对待数组一样对待整型
本文关键字:整型 一样 数组 何像 | 更新日期: 2023-09-27 18:04:13
假设我有5个int ,它们不是数组!,我想在一个循环中改变它们。有没有办法使一个数组将得到这5个数字的值,并可以直接改变他们?
类似:
int a = 10;
int b = 20;
int[] rihanna = // .... ?
for(int a=0; a<rihanna.length;a++)
rihanna[a]++;
Console.WriteLine("{0} {1} ",a,b) // what I want to see here is 11 and 21
我认为有一种方法可以解决这个问题,如果你放松要求-有实体数组,将允许修改一组本地int
变量在数组上的操作。
要做到这一点,可以捕获对委托数组中每个取ref int val
的变量的引用。
void Increase(ref int x)
{
x++;
}
void Set(ref int x, int amount)
{
x = amount;
}
void Sample()
{
int a = 10;
int b = 20;
// Array of "increase variable" delegates
var increaseElements = new Action[] {
() => Increase(ref a),
() => Increase(ref b)
};
increaseElements[0](); // call delegate, unfortunately () instead of ++
Console.WriteLine(a); // writes 11
// And now with array of "set the variable" delegates:
var setElements = new Action<int>[] {
v => Set(ref a,v),
v => Set(ref b,v)
};
setElements[0](3);
Console.WriteLine(a); // writes 3
}
指出- 直接使用委托,你必须用()调用它们。
- 它可能会修复
()
而不是++
的问题包装委托到一个对象,将调用增加作为其++
实现.... -
Set
版本的问题,其中需要调用(3)
而不是= 3
将需要更多的技巧-实现自定义类与索引重定向set [index]
调用保存的setter函数。
警告:这实际上是为了娱乐目的-请不要在实际代码中尝试。
我想用下面的语句作为前言。虽然这是你想要的…它很丑。这更符合你假设你可以用c#"做"的事情。而事实上这要难得多。
unsafe {
int* a = stackalloc int[1];
int* b = stackalloc int[1];
*a = 10;
*b = 20;
int*[] rihanna = { a, b };
for (int i = 0; i < rihanna.Length; i++) {
(*rihanna[i])++;
}
Console.WriteLine("{0} {1} ", *a, *b); // "11 21"
}
一般来说,这里的答案是不。这将要求c#允许对整数(或其他值类型)的引用,而它不允许(并且有充分的理由)
我能为你想出的最好的解决方案是使用一个带有ref
参数的函数。既然你要对一堆任意的整数变量进行操作,你还是得把它们都列出来。不如用函数调用来实现,像这样:
void Increase(ref int x) {
x++;
}
int a = 10;
int b = 20;
Increase(ref a);
Increase(ref b);
在。net中实际上不能这样做。int
是值类型,所以你不能直接引用它们。
class IntReference
{
int Value { get; set; }
}
IntReference a = new IntReference() { Value = 10 };
IntReference b = new IntReference() { Value = 20 };
IntReference[] rihanna = { a, b };
for (int i = 0; i < rihanna.Length; i++)
rihanna[i].Value = rihanna[i].Value + 1;
Console.WriteLine("{0} {1} ", a.Value, b.Value); // "11 21"
尽管你真的不应该这样做。