1

コードは次のとおりです。

struct m1
{
    public int a;
    public int b;
}

int main()
{
    List <m1> mList;
    m1.initialize;
    //new. and add some items to it.

今、最初に試した mList のオブジェクトにアクセスしたい:

    for each(m1 it in mList)
    {
        m1.a = 5;
    }

しかし、それは失敗しました。for each の後、コンソールに m1.first().a を書いたからです。5ではなく初期化された値でした。

それから私は試しました

    for (int counter = 0; counter < mList.size(); counter++)
    {
        m1 it = mList[counter];
        it.a = 5;
    }

再び同じ問題。

それから私は試しました

    for (int counter = 0; counter < mList.size(); counter++)
    {
        mList[counter].a = 5;
    }

コンパイルさえしませんでした。エラーが発生します。list.this[int] の戻り値を変更できないということです。

それから私は試しました

    for (int counter = 0; counter < mList.size(); counter++)
    {
        var m1 it = mList[counter];
        it.a = 5;
    }

それもうまくいきませんでした。インターネットとこのサイトで見つけたすべてのことを試しました。リスト内のオブジェクト (構造体型) のパラメーターにアクセスする方法を見つけるのを手伝ってくれませんか? リストがオブジェクトから(クラスから)作成されると、明らかに簡単です。構造体のオブジェクトからリストを作成したい場合、複雑になります。どんな助けでも大歓迎です。

4

3 に答える 3

10

問題は、構造体をリストに入れたことです。リストからフェッチすると、コピーが作成されます。したがって、変更しても効果はありません。コメントを考えると、C#で値型と参照型がどのように機能するかについて混乱している可能性があります。その場合は、このトピックに関する私の記事(または本やMSDNなど)を読むことをお勧めします。

それをフェッチし、コピーを変更してから、リスト内の値を置き換える必要があります。

var copy = list[index];
copy.a = 5;
list[index] = copy;

ただし、そもそも可変値型を作成しないことを強くお勧めします。これは、これらがまさにこの種の問題を引き起こすためです。値型は通常、その場で変更できないより「基本的な」値に使用する必要があります。たとえば、「5番」の意味を変更したり、「1月1日午前10時」を変更したりしても意味がありません。意味を変えると、新しい価値が生まれます。つまり、それを真に新しい価値にするように強制してください。

不変の値型を作成してリスト内で置き換える必要があるのか​​、代わりに可変の参照型(クラス)を作成する必要があるのか​​は(コンテキストが不足しているため)不明です。または、不変の参照型でさえ、読みやすさを向上させることがよくあります。

また、パブリックフィールドを使用しないことをお勧めします。代わりにプロパティを使用して、実装の詳細を型のAPIから分離します。

于 2012-08-26T08:39:56.623 に答える
2

これを試して:

m1 temp ;
for (int counter = 0; counter < mList.size(); counter++)
    {
        temp = mList[counter];
        temp.a = 5;
        mList[counter] = temp
    }
于 2012-08-26T08:42:57.343 に答える
1

一時変数を使用せずに構造体を操作することに興味がある場合は、構造体コレクションを使用してください。

           m1[] mList = new m1[100];
            //initialize 100 items

            for (int i = 0; i < 100; i++)
            {
                mList[i].a = 5;
            }
于 2012-08-26T09:00:18.320 に答える