2016-08-03 28 views
0

Ich versuche, eine neue Liste von findall oder wo und ändern Sie diese neue Liste, ohne dass es Änderungen am Original. Wenn list2 aus FindAll erstellt wird und eine Änderung an list2 vorgenommen wird, sollte dies list1 nicht beeinflussen. Woher?asp.net Liste von FindAll ändern oder wo ohne Änderung der ursprünglichen Liste gesucht

Edit ... Gebrauchte Kombination beider Antworten, die zu funktionieren scheint. Irgendwelche voraussichtlichen Ausgaben ??? Arbeitscode bearbeitet Bearbeiten ... Es funktioniert nicht. Für eine Klasse, die eine Eigenschaft des Objekts ist, werden keine Daten kopiert ... Irgendwelche Ideen ??? Ich kann nicht verstehen, warum Kopieren oder Klonen einfach und einfach für eine Liste ist.

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Started"); 
     List<SampleData> list1 = SampleData.MakeList(3); 
     for (int i = 0; i < list1.Count; i++) 
     { 
      Console.WriteLine("list1.Number => " + list1[i].Number); 
      Console.WriteLine("list1.Person => " + list1[i].Person); 
     } 
     List<SampleData> list2 = new List<SampleData>(list1.FindAll(m => m.Number == 1).Select(x => new SampleData().ShallowCopy())).ToList(); 
     for (int i = 0; i < list2.Count; i++) 
     { 
      list2[i].Person = "Person " + list2[i].Number; 
      Console.WriteLine("list2.Number => " + list2[i].Number); 
      Console.WriteLine("list2.Person => " + list2[i].Person); 
     } 

     SampleData sd = list2.Find(s => s.Number == 1); 
     Console.WriteLine("Apartment Number" + sd.apartment.BuildingLetter); // <<<<------------------- THROWING NULL EXCEPTION FOR APARTMENT 

     Console.WriteLine("-------AFTER MODIFYING NEW LIST----LIST1.Person SHOULD BE NULL---"); 
     for (int i = 0; i < list1.Count; i++) 
     { 
      Console.WriteLine("--list1.Number => " + list1[i].Number); 
      Console.WriteLine("--list1.Person => " + list1[i].Person); 
     } 
     for (int i = 0; i < list2.Count; i++) 
     { 
      Console.WriteLine("--list2.Number => " + list2[i].Number); 
      Console.WriteLine("--list2.Person => " + list2[i].Person); 
     } 
     Console.ReadLine(); 
     System.Environment.Exit(0); 
    } 

} 
class SampleData 
{  
    public int Number { get; set; } 
    public String Person { get; set; } 
    public Apartment apartment { get; set; } 
    public static List<SampleData> MakeList(int count) 
    { 
     List<SampleData> l = new List<SampleData>(); 
     for (int i = 0; i < count; i++) 
     { 
      SampleData d = new SampleData(); 
      d.apartment = new Apartment { RoomNumber = i, BuildingLetter = "letter-" + i }; 
      d.Number = i; 
      l.Add(d); 
     } 
     return l; 
    } 
    public SampleData ShallowCopy() 
    { 
     return (SampleData)this.MemberwiseClone(); 
    } 

} 
class Apartment 
{ 
    public int RoomNumber { get; set; } 
    public String BuildingLetter { get; set; } 
} 
+0

Offenbar das funktioniert nicht, wenn es eine Zusatz-Klasse als eine der Eigenschaften ist. Bei einer Eigenschaft, die eine separate Klasse ist, werden ihre Daten nicht kopiert. Siehe bearbeiteten Code. – user2828970

Antwort

0

Sie können verwenden. AsNoTracking() Method bei Entity Abfrage wheen ausgewählt aus DbContext oder Object

List<SampleData> list2 = new List<SampleData>(list1.Where(m => m.Number == 1).AsNoTracking().ToList()); 

oder eine Kopie Contractor verwenden wie die

class SampleData 
{ 
    public int Number { get; set; } 
    public String Person { get; set; } 

    public SampleData(SampleData obj) 
    { 
     This.Number=obj.Number; 
     This.Person=obj.Person; 
     .. 
     .. 
    } 
    public static List<SampleData> MakeList(int count) 
    { 
     List<SampleData> l = new List<SampleData>(); 
     for (int i = 0; i < count; i++) 
     { 
      SampleData d = new SampleData(); 
      d.Number = i; 
      l.Add(d); 
     } 
     return l; 
    } 
} 

Dann

List<SampleData> list2 = new List<SampleData>(list1.Where(m => m.Number == 1).Select(x=>new SampleData(x)).ToList()); 
+0

Diese Liste der SampleData-Klasse ist eine sehr kleine Klasse von Eigenschaften. Das ist leicht genug für eine kleine Klasse, aber für eine große Klasse gibt es viel mehr Eigenschaften. Gibt es einen einfacheren Weg, um alle Eigenschaften zu erhalten, ohne jeden in der Auswahl zu spezifizieren. Also werden alle Eigenschaften dieses Artikels kopiert? – user2828970

0

ShallowCopy ist dein Freund.

Definieren Sie eine ShallowCopy() - Methode in Ihrer SampleData-Klasse wie folgt.

class SampleData 
{ 
    public int Number { get; set; } 
    public String Person { get; set; } 
    public static List<SampleData> MakeList(int count) 
    { 
     List<SampleData> l = new List<SampleData>(); 
     for (int i = 0; i < count; i++) 
     { 
      SampleData d = new SampleData(); 
      d.Number = i; 
      l.Add(d); 
     } 
     return l; 
    } 

    public SampleData ShallowCopy() 
    { 
     return (SampleData)this.MemberwiseClone(); 
    } 

} 

Dann list2 wie folgt benutzt ...

List<SampleData> list2 = new List<SampleData>(); 
foreach (SampleData sd in list1.Where(m => m.Number == 1)) 
{ 
    list2.Add(sd.ShallowCopy()); 
} 
+0

Also habe ich eine Kombination aus beiden Antworten von schattigen und gthb7 verwendet. Danke für beide Eingaben. Ich konnte nicht AsNoTracking-Methode erkannt werden (versucht, Referenzen für System.Data.Entity und EntityFramework hinzuzufügen, aber nicht angezeigt ..., die viel einfacher und sauberer sah. Also eine Kombination der 2. Ich tat nicht Ich möchte verantwortlich sein für hinzugefügt und erinnere mich daran, alle Eigenschaften hinzuzufügen, so dass die ShallowCopy eine gute Ergänzung zu den ersten war, die zu funktionieren scheint. Alle vorgesehenen Probleme ??? Code verwendet, dass es funktioniert Ich werde meinen ursprünglichen Beitrag bearbeiten – user2828970

+0

* Alle geplanten Probleme? * Vielleicht. Beachten Sie, dass 'MemberwiseClone' eine flache Kopie erstellt, aber wenn es Sammlungen enthält, werden die Elemente in den Sammlungen * nicht * kopiert (es ist eine neue Sammlung mit den gleichen Elementen). –