2017-11-26 2 views
0

次のコードはstudentクラスとstudentクラスのclonedStudentListの2つです。私は一つのリストを更新していますが、他のリストは変更すべきではありません。しかしそれでも変わっています。 私はちょうど学生がstudentId2を持っているかどうかチェックしています。studentListから新しい値を取得することによってclonedStudentListのStudentId値を更新します。studentId2値がない場合、clonedStudentListのStudentId値を更新します。 studentid refの辞書はディープコピーの場合でも、1つのリスト内の更新によって他のものが変更されています。C#

var clonedStudentList = studentList.ToList(); 
clonedStudentList.ForEach(x => 
{ 
    studentList.ForEach(y => 
    { 
    if (y.StudentId2.HasValue && StudentIds2Dictionary.ContainsKey(y.StudentId2.Value)) 
    { 
     x.StudentId= StudentIds2Dictionary[y.StudentId2.Value]; 
    } 
    else if(StudentIdsDictionary.ContainsKey(y.StudentId.Value)) 
    { 
     x.StudentId= StudentIdsDictionary[y.StudentId.Value]; 
    } 
    }); 
}); 

私も

var clonedStudentList = new List<Student>(studentList); 

が、それでも同じ問題を使用していました。

助けが必要ですか?

+1

studentListには、新しいリストを作成するための参照が含まれています。同じオブジェクトを操作しています。生徒を複製する必要がある場合は、コピーする必要があることを知っている学生の中に独自のメソッドを作成し、新しい生徒を作成し、値をコピーしてコピーした生徒を返します。 –

+0

@パトリック:深いコピーは私たちが同じことをするのを助けるものではありません。他の変更があればそのリストを変更しません。実際にstudentListのすべての内容を新しいリストに入れたいと思います。同じになります。 –

+0

あなたのコードはどこから深いコピーをしていると思いますか? –

答えて

1

あなたの事実を確認するためにこれを使用してください:静的なObjectIDGeneratorは、あなたが知っているそれぞれのものに対してユニークなIDを与えます。 clonedStudentList = new List<Student>(studentList);によって深くコピーされていません。後でIDが一致しません。

これまでのStudentオブジェクトと同じ参照を含む新しいListを作成するだけです。内部をコピーして新しい生徒を作成する独自のコピーメソッドを作成します。

internal class Program 
{ 
    static void Main(string[] args) 
    { 
     string[] data = "One;Two;Dhree;Four;Vive;Six;Ceven;Eight;Nine;Pen".Split(';'); 

     var studs = data.Select(d => new Student(d, d.Length < 4 ? "m" : "f")).ToList(); 

     var l2 = new List<Student>(studs); 

     var l3 = studs.Select(s => Student.CopyMe(s)); 

     Console.WriteLine("Org:"); 
     Console.WriteLine(" " + string.Join("\n ", studs)); 

     Console.WriteLine("'deep':"); 
     Console.WriteLine(" " + string.Join("\n ", l2)); 

     Console.WriteLine("'copied':"); 
     Console.WriteLine(" " + string.Join("\n ", l3)); 

     Console.ReadLine(); 
    } 
} 

internal class Student 
{ 
    public Student(string name, string gender) 
    { 
     Name = name; 
     Gender = gender; 
    } 

    public string Gender { get; set; } 
    public string Name { get; set; } 

    public static Student CopyMe(Student s) 
    { 
     return new Student(s.Name, s.Gender); 
    } 

    public override string ToString() 
    { 
     return string.Join(" ", new[] { Name, Gender, g.GetId(this, out var firstTime).ToString() }); 
    } 

    private static ObjectIDGenerator g = new ObjectIDGenerator(); 
} 

出力:

Org: 
    One m 1 
    Two m 2 
    Dhree f 3 
    Four f 4 
    Vive f 5 
    Six m 6 
    Ceven f 7 
    Eight f 8 
    Nine f 9 
    Pen m 10 

'deep': // SAME IDs as before 
    One m 1 
    Two m 2 
    Dhree f 3 
    Four f 4 
    Vive f 5 
    Six m 6 
    Ceven f 7 
    Eight f 8 
    Nine f 9 
    Pen m 10 

'copied': // NEW ids 
    One m 11 
    Two m 12 
    Dhree f 13 
    Four f 14 
    Vive f 15 
    Six m 16 
    Ceven f 17 
    Eight f 18 
    Nine f 19 
    Pen m 20 

私は事実の後に出力する//コメントを追加しました。

関連する問題