0

リストの最後のオブジェクトをコピー (および挿入) するにはどうすればよいですか?

public class MyObject
{
    public string first {get;set;}
    public string second {get;set;}
}

List<MyObject> list = new List<MyObject>();
list.Add(new MyObject{first = "one", second = "two"});
list.Add(new MyObject{first = "here", second = "there"});
list.Add(new MyObject{first = "car", second = "plane"});

MyObject newObj = new MyObject();
list.Add(newObj);

リストの最後の 2 つのオブジェクトが同じオブジェクトへの参照であるように見えます。リストの最後のオブジェクトのコピーである新しいオブジェクトを作成するにはどうすればよいですか?

EDIT この例では、問題とクラス (実際には MyObject とは呼ばれません) を単純化すべきではありませんでした。実際には、より多くの子オブジェクトとリストがあるため、はるかに大きくなります。

4

4 に答える 4

2

2 つの一般的な方法があります。

(1) MyObject クラスのCopy Constructorを作成し、それを使用してオブジェクトのコピーを作成し、コピーを挿入します。

(2) または、MyObject クラスのCloneメソッドを記述し、それを使用してコピーを作成し、コピーを挿入します。

ただし、提示したコードでは、何かのコピーを作成したり、既存のオブジェクトへの参照をリストに挿入したりしていません。

これを行う方法の例を次に示します。

public class MyObject
{
    public string first
    {
        get;
        set;
    }
    public string second
    {
        get;
        set;
    }

    public MyObject DeepClone()
    {
        return new MyObject{ first = this.first, second = this.second;}
    }
}

// Then you can do this:

List<MyObject> list = new List<MyObject>();
list.Add(new MyObject{first = "one", second = "two"});
list.Add(new MyObject{first = "here", second = "there"});
list.Add(new MyObject{first = "car", second = "plane"});

list.Add(list[list.Count-1].DeepClone());        
于 2012-12-04T15:07:07.147 に答える
1

そうではありません。4 つMyObjectの があり、すべてが異なります。

オブジェクトを比較する場合、これらが値オブジェクトであれば、値に基づいて equals メソッドを定義する必要があります。それ以外の場合は、equals を適切に定義してください。

これを読む:

http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

質問が編集された後に編集します(編集されたと断言できました!)

別のものを引数として受け入れMyObject、値をコピーするコンストラクターを作成する必要があります。

文字列は不変であるため、(文字列を複製しようとするよりも) それらへの参照をコピーしても安全です。object の文字列値を変更しても、 objectaには影響しませんb

ちなみに、MyObjectはクラスの名前ではありません。

于 2012-12-04T15:05:31.403 に答える
0

ここでは、クローン作成、浅いコピーと深いコピーの濁った海に入っています。しかし、そのような単純なクラスでは、次のもので問題ありません。

var newObj = new MyObject();
newObj.first = list[3].first;
newObj.second = list[3].second;

list.Add(newObj);

これは、first と second が文字列であり、割り当てが参照によるものではないためです。

また、現在のコードを見ると、リストには 4 つの異なる「MyObject」インスタンスがあり、最後のインスタンスには「first」または「second」プロパティのいずれも初期化されていません。

于 2012-12-04T15:07:18.007 に答える
0

オーバーライドしていない場合、オブジェクトをコピーする魔法のような方法はありませんClone。しかし、それは次のように簡単です:

MyObject last = list.Last();
list.Add(new MyObject{first = last.first, second = last.second});
于 2012-12-04T15:08:15.590 に答える