1

私はこのクラスを持っています:

public class Person : ICloneable
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public object Clone()
    {
        return this;
    }
}

拡張メソッド:

public static class MyHelper
{
    public static IEnumerable<T> Clone<T>(this IEnumerable<T> collection) where T : ICloneable
    {
        return collection.Select(item => (T)item.Clone());
    }
}

この場合に使用したい:

var myList = new List<Person>{ 
    new Person { FirstName = "Dana", LastName = "Scully" },
    new Person{ FirstName = "Fox", LastName = "Mulder" }
};

List<Person> myCopy = myList.Clone().ToList<Person>();

「イミディエイトウィンドウ」で値をmyCopy変更すると、元のリストにも変更があります。

両方のリストを完全に独立させたい

私は何かを逃しましたか?

4

3 に答える 3

3

の実装Cloneが間違っています。

これを試して:

public object Clone()
{
    return MemberwiseClone();
}
于 2012-07-31T06:52:19.203 に答える
1

cloneメソッドは同じオブジェクトを返します。

このように実装する必要があります

public class Person : ICloneable
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public object Clone()
    {
        return new Person { FirstName = this.FirstName, LastName = this.LastName };
    }
}
于 2012-07-31T06:50:20.683 に答える
1

Cloneクラス内のメソッドの問題とは別に、Person拡張メソッドでも新しいリストを返す必要があります

return collection.Select(item => (T)item.Clone()).ToList();

これは、Selectメソッドが遅延実行を使用するLinqからのものであるためです。元のリストを変更すると、「myCopy」のリストも変更されます。

于 2012-07-31T06:54:13.350 に答える