2013-04-04 15 views
6

FirstOrDefault restituisce un riferimento all'elemento nella raccolta o il valore dell'articolo?FirstOrDefault restituisce un riferimento all'elemento nella raccolta o al valore?

var obj = myCollection.FirstOrDefault(x => x.Param == "match condition"); 
    if (obj != null) 
    { 
    obj = newObjectOfCollectionType; //if found, replace with the changed record 
    } 

Sarà questo codice sostituire il riferimento all'oggetto nella myCollection con il nuovo oggetto, o intende fare nulla per myCollection?

+1

È possibile modificare l'oggetto ritorna, ma non è possibile sostituirlo. Quindi se hai fatto qualcosa come 'obj.SomeProperty = newPropertyValue' aggiornerà l'oggetto nella tua raccolta. – juharr

+0

Le sequenze sono di sola lettura, quindi non è possibile cambiarle. Devi creare una nuova collezione. myCollection = mycollection.Select (x => x.Param == "condition condition"? newObjectOfCollectionType: x) .ToList() // o ToArray/ToDictionary – adrianm

risposta

4

non farà nulla; obj è un riferimento all'oggetto (se la raccolta è di un tipo di riferimento) e non l'oggetto stesso.
Se la raccolta è di tipo primitivo, obj sarà una copia del valore nella raccolta e, di nuovo, questo significa che la raccolta non cambierà.

Modifica:
per sostituire l'oggetto, dipende dal tipo di raccolta.
Se è IEnumerable<T>, non è modificabile e non è possibile modificarlo.
L'opzione migliore che avete è quello di creare una nuova collezione e modificare che, come cd

T [] array = myCollection.ToArray(); 
array[index] = newObject; 
+1

Grazie. C'è un buon modo per sostituire l'oggetto se esce nella collezione? – trashrobber

+0

ho modificato la mia risposta –

+0

@sJhonny: Questo non cambierà 'myCollection'. Cambierà semplicemente 'array'. –

2

Si restituisce il valore che è nella collezione. Ma quel valore, nel tuo caso, è un riferimento.

Non restituisce la posizione. Il tuo codice non cambierà la collezione.

+0

"nel tuo caso, è un riferimento" - perché? Il tipo di elementi può essere una 'struct' con proprietà' Param'. – Dennis

+3

@Dennis: il codice ha 'if (obj! = Null)'. Se 'obj' fosse un tipo di valore (' struct'), quella riga di codice non sarebbe stata compilata. –

1

Se la sequenza è una sequenza di tipi di riferimento, viene restituito il riferimento. Altrimenti, il valore viene restituito.

Ma, in ogni caso, questa linea:

obj = newObjectOfCollectionType 

non fa nulla con il contenuto di sequenza, a prescindere dal tipo di elemento di sequenza.

4

È possibile modificare la raccolta in questo modo:

int index = myCollection.FindIndex(x => x.Param == "match condition"); 
if (index != -1) 
{ 
    myCollection[index] = newObjectOfCollectionType; 
} 
+0

Questo non sembra rispondere alla domanda ESATTA del poster, ma credo che risolva il problema che stavano avendo. Ha risolto il mio! Non sapevo di "FindIndex" fino a quando ho visto questo post. Grazie a un utente SO con 1 reputazione per avermi aiutato! LINQ è molto robusto! –

Problemi correlati