2

私が達成しようとしているのは、私が配列を持っていると言うことです。それを指すことで、コード全体で特定の配列要素を変更できるようにしたいと考えています。

たとえば、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;
}

グーグルで調べてみたところ、「安全でない」方法でそれを行う方法があるようですが、私は本当にそのルートに行きたくありません。

インデックスを格納する変数を作成できると思いますが、実際にはもう少し複雑に対処しています (リスト内のリスト。したがって、2 つのインデックス変数を使用するとコードが複雑になるようです)。

C#にはデータバインディングクラスがあるため、現在行っているのは、配列要素をテキストボックス(非表示)にバインドし、特定の配列要素を変更したいときはいつでもそのテキストボックスを変更することですが、それも良い解決策ではありません(意図した目的で使用されていないテキストボックスがあります-少し誤解を招きます)。

4

4 に答える 4

2

使用方法の AC# の例が役立ちます。あなたが何を求めているのか理解できれば、このような単純なクラスでそれができるかもしれません。あなたが求めていることは、あまり良い考えではないようです。これが必要な広い範囲を示した場合、誰かがこの種の機能をまったく必要としないより良い設計を指摘できるかもしれません。

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);
于 2012-12-17T17:20:17.287 に答える
0

これが正確に適合するかどうかはわかりませんが、問題は、これらのポインターが c# で使用できないことです。

より複雑なリストがある場合はLinkedList<T> 、リスト内の要素を変更する場合にパフォーマンスの高い方法を提供することを確認できます。

于 2012-12-17T17:16:14.563 に答える
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++ のソリューションほどきれいではありませんが、必要に応じて機能し、配列を参照するより「自動」なバージョンを提供します。

于 2012-12-17T17:21:25.833 に答える
0

配列を でラップしますObjects。C# では、通常、ポインター操作が必要なものはオブジェクトで行うのが最適です。

オブジェクトの利点は、より明確な名前付けと、より複雑なデータ構造へのアクセスが可能になることです。おっしゃるとおり、一連のインデックスを渡すのは理想的ではありません - 順序付けとインデックス付けは簡単に混乱してしまいます..

したがって、 がありclass MyArray { }、ポインターと同じように「オブジェクト参照」を使用でき、さらに の配列を作成できますMyArray[]

于 2012-12-17T17:22:15.480 に答える