2013-08-15 11 views
5

Haben Sie eine Liste von Objekten mit der Objektstruktur wie folgtaktualisieren in Objektsammlung mit Linq

public class Schedule 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 

    public Schedule() {} 
} 

eine Linq-Abfrage auf Daten Ausführen ich später richtig bevölkerten Liste der Objekte

var schedule = (from d in data 
       select new Schedule 
       { 
        ID = d.id, 
        Name = "" 
       }).ToList(); 

sehen im Code möchte ich Eigenschaft ändern Name hängt von einer Bedingung ab. Ein paar Beispiele, die ich gefunden

schedule.ForEach(s => { s.Name = "Condition Name"; }); 
schedule.Select(s => { s.Name = "Condition name"; return s; }); 

nach der Ausführung lassen Name Parameter "null", wenn ich Zeitplan im Überwachungsfenster aktualisieren. Kann jemand sehen, was mit diesem falsch ist?

durch Sammlung Looping und versuchen, Eigentum zu ändern, ist es auch nicht ändern

foreach (var sch in schedule) 
    { 
     sch.Name = "New name"; 
    } 

schedule.ToList() [0] .Name == ""

UPDATE

.ToList() Aufruf in das folgende Snippet ist wichtig, um Code zu arbeiten.

var schedule = (from d in data 
       select new Schedule 
       { 
        ID = d.id, 
        Name = "" 
       }).ToList(); 
+2

Um zu beginnen, Sie ein ausgewähltes Neues zu machen und nur die ID –

+0

@MrJones verpasstes Abrufen in Code aber ich wähle Sie im Objekt – Maxim

+0

Ja, aber Sie sind nur die ID-Eigenschaft festlegen. Sie sollten etwas wie '(von d in Daten wählen Sie neuen Zeitplan {ID = d.ID, Name = d.Name}). ToList()'. Sonst ist 'sehdule.Name' gleich null. –

Antwort

3

Der Code funktioniert geben - nach der Ausführung schedule.ForEach() die Eigenschaft Name wird aktualisiert. Vielleicht gibt es etwas, das du weggelassen hast.

3

LINQ ist nicht das richtige Werkzeug zum Ändern von Sammlungen, es ist ein Werkzeug zum Abfragen von Sammlungen. Wenn Sie es ändern wollen, müssen Sie eine Schleife, zum Beispiel ein foreach:

var schedule = data.Select(d => new Schedule{ ID = d.id }).ToList(); 
foreach(var s in schedule) 
    s.Name = "Condition Name"; 

Wenn Sie auf „ändern“ wollen eine Sammlung mit LINQ haben Sie einen neuen erstellen und zuweisen, dass auf Ihre Variable was ineffizient ist .

+0

Theoretisch sollte funktionieren, aber am Ende Prop unverändert lassen. Frage aktualisiert – Maxim

+0

@Maxim: 'schedule.ToList()' erstellt immer eine neue Liste. –

+0

Mein Fehler mit Codebeispiel, in der Frage Update erwähnt. Danke euch allen. Upvotes. – Maxim

4

Ihre LINQ-Abfrage, die schedule einen Wert zuweist, erstellt unabhängige Objekte basierend auf der ursprünglichen Auflistung (es klont effektiv die Objekte); Ändern der Eigenschaften der Klone ändert nicht die ursprünglichen Objekte.

0

Im Folgenden werden Sie neu erstellt Schedules ohne Name zu setzen.

var schedule = (from d in data 
       select new Schedule 
       { 
        ID = d.id 
       }).ToList(); 

zu starten, sollten Sie die neue Schedules ein Name

var schedule = (from d in data 
       select new Schedule 
       { 
        ID = d.id, 
        Name = d.NameProperty /* Switch out with real name property */ 
       }).ToList(); 
Verwandte Themen