2016-06-20 5 views
-2
SelectedListObjA.Where(x => x.FieldA == "ABC").FirstOrDefault() = ObjA; 

SelectedListObjA = new List<ObjType>(); 
ObjType ObjA = new ObjType(); 

Kann jemand mir erklären, warum die obige Aussage falsch ist. Es wirft The Left hand side of an assignment must be a variable...kann nicht ein bestimmtes Objekt in einer Liste ersetzen?

+0

Ich dachte, 'FirstOrDefault()' in einem Objekt zurück? –

+0

Grundsätzlich werde ich ein obj abrufen, wo 'FieldA ==‚ABC'' und das erste Vorkommen wird durch 'ObjA' ersetzt werden. 'ObjA.FieldA' ist zum Beispiel 'CDE' .... Grundsätzlich ist es ein anderes Objekt –

+0

' ObjA = SelectedListObjA.Where (x => x.FieldA == "ABC"). FirstOrDefault() ' – Mairaj

Antwort

5

Was Sie als Ergebnis von erhalten, ist das erste Element in der Quelle. So bekommst du ein Objekt. Aber Zuordnung kann nur auf variable, property or indexer durchgeführt werden. Wenn Sie das Objekt ersetzen möchten, können Sie etwas wie folgt verwenden:

var tmp = SelectedListObjA.Where(x => x.FieldA == "ABC").FirstOrDefault(); 
if (tmp != null) { // If tmp is reference type. Would be better to use default() 
    var index = SelectedListObjA.IndexOf(tmp); 
    SelectedListObjA[index] = ObjA; 
} 
0

können Sie das nicht tun.

  1. FirstOrDefault kann null zurückgeben. Was würdest du passieren lassen? Soll der Wert zur Liste hinzugefügt werden?

  2. Wenn FirstOrDefault wird ein Objekt zurückgeben, es wird nur die Referenz in einer neuen Variable auf das Objekt sein. Eine Zuordnung zu diesen Variablen wird die Liste nicht ändern, sondern nur die Referenz der Variablen zeigen auf. Die Liste bleibt unverändert.

Wenn Sie ein Element in der Liste ersetzen möchten, müssen Sie den Index dieses Elements finden und das Objekt an diesem Index mit Ihrem neuen ersetzen.

var objectToReplace = SelectedListObjA.Where(x => x.FieldA == "ABC").FirstOrDefault(); 
if (objectToReplace != null) 
{ 
    SelectedListObjA[SelectedListObjA.IndexOf(objectToRelplace)] = ObjA; 
} 
else 
{ 
    SelectedListObjA.Add(ObjA); 
} 

Prost

Thomas