2013-04-24 16 views
6

To może być głupie pytanie, ale zawsze używałem linq do wybierania przedmiotów.Czy można manipulować listami za pomocą LINQ?

Ale chcę wiedzieć, czy możliwe jest wykonanie następującego prostego zadania przy użyciu jego słów kluczowych.

List<OrdersInfo> ordersList 
. 
. 
. 
foreach(OrdersInfo OI in ordersList) 
     if(OI.TYPE == "P") 
      OI.TYPE = "Project"; 
     else 
     OI.TYPE = "Support"; 
+2

LINQ ma być wolny od mutacji. Jeśli chcesz manipulować, użyj 'foreach'. – Jon

+0

Dziękuję wszystkim – AngelicCore

Odpowiedz

4

Nie, LINQ(Language-Integrated Query) jest zapytania język i to naprawdę błyszczy w consise definicji zapytania, ale nie zawsze dobrze na tym, że zbyt (prędkość i/lub problemy z pamięcią).

Jeśli chcesz zmodyfikować kolekcję, pozostań przy tym, jak już to robisz.

+0

Tigran, zgadzam się z większością części twojej odpowiedzi, ale możesz modyfikować listę używając LINQ. (Chociaż nie powinno) – Habib

+0

+1, jedyną odpowiedzią jest "Nie". – user7116

1

LINQ jest dla zapytań Kolekcja, dla modyfikacji aktualna pętla jest bardziej czytelny i lepszym rozwiązaniem, ale jeśli opcja LINQ to chcesz:

Jeśli OrderInfo jest klasa (typ odniesienia), a następnie można modyfikować właściwości obiektu, (Ty nie można ustawić przypisywać im wartości null lub nowych odniesień).

var ordersList = new List<OrdersInfo>(); 
ordersList.Add(new OrdersInfo() { TYPE = "P" }); 
ordersList.Add(new OrdersInfo() { TYPE = "S" }); 
ordersList.Add(new OrdersInfo() { TYPE = "P" }); 
ordersList.Select(r => (r.TYPE == "P" ? r.TYPE = "Project" : r.TYPE = "Support")).ToList(); 

z klasą zdefiniowany jako:

class OrdersInfo 
{ 
    public string TYPE { get; set; } 
} 

Oto zrzut ekranu enter image description here

Co ciekawe nie przypisać wynik z powrotem do ordersList

+0

Byłoby miło, gdyby osoba, która odniosła wniosek, wskazała na pomyłkę. – Habib

+0

Nie jesteś pewien błędu składniowego, prawdopodobnie błędem jest pokazanie komuś, jak to zrobić, używając LINQ? – user7116

+0

@sletterlety, syntaktycznie poprawne, faktycznie testowałem to w VS. Zgadzam się, że nie powinno się tego robić za pośrednictwem LINQ i mam to również na początku mojej odpowiedzi, ale odrzucam za pokazanie, czy jest to możliwe ... hmm. to nowość dla mnie :) – Habib

6

You może użyć ForEach me thod z klasy List.

ordersList.ForEach(oi => oi.TYPE = oi.TYPE == "P" ? "Project" : "Support"); 

Jeśli chcesz mieć metodę ForEach w IEnumerable typu można stworzyć swój własny rozszerzenie ForEach

public static void ForEach<T>(this IEnumerable<T> en, Action<T> action) 
{ 
    foreach(T item in en) 
    { 
     action(item); 
    } 
} 
1

ForEach nie jest rozwiązaniem LINQ, ale wygląda na to:

ordersList.ForEach(OI => OI.TYPE = OI.TYPE == "P" ? "Project" : "Support"); 

Dostępne tylko na instancji List<T>, a nie na IEnumerable<T>.

+0

Niestety nie widzę Twojej odpowiedzi – binard

+0

Publikujemy w tym samym czasie, a my jesteśmy tutaj, aby pomóc, a nie konkurować :) –

+0

Nie rozumiem duplikatu OI.TYPE – AngelicCore

Powiązane problemy