我想要实现的是说我有一个数组,我希望能够通过指向它来修改整个代码中的特定数组元素。
例如在C ++中我可以这样做
int main(){
int arr [5]= {1,2,3,4,5};
int *c = &arr[3];
cout << arr[3] <<endl;
*c = 0;
cout << arr[3]<<endl;
}
我做了一些谷歌搜索,似乎有办法通过“不安全”来做到这一点,但我真的不想走那条路。
我想我可以创建一个变量来存储索引,但实际上我处理的是复杂性稍高(列表中的列表。所以有两个索引变量似乎会增加代码的复杂性。)
C#有一个数据绑定类,所以我现在正在做的是将数组元素绑定到一个文本框(我已经隐藏)并在我想修改特定的数组元素时修改该文本框,但这也不是一个好的解决方案(因为我有一个没有用于其预期用途的文本框 - 有点误导)。
答案 0 :(得分:2)
您希望使用外观的C#示例会有所帮助。如果我明白你在问什么,像这样的简单课程可能会这样做。你问的是什么,似乎不是一个好主意。如果你展示了你需要的更大的范围,有人可能会指出一个更好的设计,你完全不需要这种功能。
public class ListElement<T> {
private IList<T> list;
private int index;
public ListElement(IList<T> list, int index) {
this.list = list;
this.index = index;
}
public T Value {
get {
return list[index];
}
set {
list[index] = value;
}
}
}
使用它看起来像
int[] arr = new int[] {1,2,3,4,5};
ListElement<int> third = new ListElement<int>(arr, 2);
Console.WriteLine(third.Value);
third.Value = 0;
Console.WriteLine(third.Value);
答案 1 :(得分:0)
我不确定这是否完全符合,但问题是这些指针在c#中是不可能的。
如果您有更复杂的列表,可以查看LinkedList<T>
如果要更改列表中的元素,它会提供高效的方法。
答案 2 :(得分:0)
我想出了一个C#的解决方案。虽然这是关闭袖口,所以它可能无法在所有情况下工作,但我确实测试了你的情况。
class Wrapper<T>
{
private T[] array;
private T item;
private int index;
public T Item { get { return item; } set { item = value;
array[Index] = value;
} }
public int Index
{
get { return index; }
set
{
index = value;
Item = array[value];
}
}
public Wrapper(T[] arr)
{
array = arr;
}
}
然后你可以使用这样的类:
class Program
{
static void Main(string[] args)
{
int[] i = {1, 2, 3, 4, 5};
i.ToList().ForEach(x => Console.WriteLine(x));
Wrapper<int> w = new Wrapper<int>(i);
w.Index = 2;
w.Item = 5;
i.ToList().ForEach(x => Console.WriteLine(x));
Console.ReadLine();
}
}
这将给出输出:1234512545
它不像C ++中的解决方案那么漂亮,但它可以按照您的需要工作,并提供引用该阵列的更“自动”版本。
答案 3 :(得分:0)
我会将你的数组包装在Objects
中。在C#中,需要指针操作的东西通常最好用对象完成。
优点是对象允许更清晰的命名和访问更复杂的数据结构。你是对的,传递一组索引是不理想的 - 排序和索引很容易混淆。事实上,我认为是你所在的人决定面向对象编程是一个好主意!!
所以你有class MyArray { }
,可以像使用指针那样使用'对象引用',
另外,您可以创建MyArray[]
的数组。