2011-08-25 10 views

risposta

60

utilizzando LINQ per trovare l'oggetto che si può fare:

var obj = myList.FirstOrDefault(x => x.MyProperty == myValue); 
if (obj != null) obj.OtherProperty = newValue; 

Ma in questo caso si potrebbe desiderare di salvare la lista in un dizionario e utilizzare questo, invece:

// ... define after getting the List/Enumerable/whatever 
var dict = myList.ToDictionary(x => x.MyProperty); 
// ... somewhere in code 
MyObject found; 
if (dict.TryGetValue(myValue, out found)) found.OtherProperty = newValue; 
+3

Grazie CKoenig, sarà questo ottenere un riferimento al 'obj' o il valore (copia)? in altre parole, sarà cambiato l'oggetto all'interno della lista? – Burjua

+4

Penso che questo non funzionerebbe se l'oggetto è di tipo struct, rendilo una classe :) –

+12

Dato che hai un elenco di oggetti personalizzati (supponendo che sia una classe e non una struct), hai a che fare con un tipo di riferimento , sarà un riferimento a quell'oggetto e la modifica verrà "persist", modificherà l'oggetto nella raccolta. –

8

o senza LINQ

foreach(MyObject obj in myList) 
{ 
    if(obj.prop == someValue) 
    { 
    obj.otherProp = newValue; 
    break; 
    } 
} 
+0

Sì, questa è una risposta ovvia, ma Non voglio usare foreach, immagino che questo sia il modo più lento per farlo – Burjua

+0

Qualcuno può commentare se il metodo LINQ sopra è effettivamente più efficiente di questo? – pseudocoder

+3

Se c'è qualche differenza, la versione di linq è probabilmente più lenta. – Erix

13

Solo per aggiungere alla risposta di CKoenig. La sua risposta funzionerà finché la classe con cui hai a che fare è un tipo di riferimento (come una classe). Se l'oggetto personalizzato era una struttura, questo è un tipo di valore e i risultati di .FirstOrDefault ti daranno una copia locale di quello, il che significa che non tornerà alla raccolta, come mostra questo esempio:

struct MyStruct 
{ 
    public int TheValue { get; set; } 
} 
codice

prova:

List<MyStruct> coll = new List<MyStruct> { 
              new MyStruct {TheValue = 10}, 
              new MyStruct {TheValue = 1}, 
              new MyStruct {TheValue = 145}, 
              }; 
var found = coll.FirstOrDefault(c => c.TheValue == 1); 
found.TheValue = 12; 

foreach (var myStruct in coll) 
{ 
    Console.WriteLine(myStruct.TheValue); 
} 
Console.ReadLine(); 

l'uscita è 10,1,145

Cambiare la struttura per una classe e l'uscita è 10,12,145

HTH

+0

ok - grazie. la mia ipotesi è che hai ottenuto un riferimento alla struttura e non una copia locale. – Carsten

+1

State usando struct, classe risolto. Grazie. – teapeng

3

Può anche provare.

_lstProductDetail.Where(S => S.ProductID == "") 
     .Select(S => { S.ProductPcs = "Update Value" ; return S; }).ToList(); 
+0

Funziona con un elenco o un array, ma non un IEnumerable – R2D2

0
var itemIndex = listObject.FindIndex(x => x == SomeSpecialCondition()); 
var item = listObject.ElementAt(itemIndex); 
listObject.RemoveAt(itemIndex); 
item.SomePropYouWantToChange = "yourNewValue"; 
listObject.Insert(itemIndex, item); 
Problemi correlati