2013-08-14 5 views
17

Ho una lista di oggetti Question e io uso un ForEach per scorrere l'elenco. Per ogni oggetto faccio un .Add per aggiungerlo alla mia struttura di entità e quindi al database.Come posso eseguire più operazioni all'interno di un ciclo C# LINQ ForEach

List<Question> add = problem.Questions.ToList(); 
add.ForEach(_obj => _uow.Questions.Add(_obj)); 

ho bisogno di modificare tutti gli oggetti nel ForEach e impostare il campo AssignedDate-DateTime.Now. C'è un modo per farlo all'interno del ciclo ForEach?

+4

Basta usare un semplice vecchio 'dichiarazione foreach'. A meno che tu non abbia una ragione specifica per usare un lambda, il che è molto improbabile, lo stai rendendo inutilmente complesso. – Jon

+0

Puoi '_obj => {mazzo di operazioni}' ma non lo consiglio. Semplice foreach è molto più pulito –

+0

Beh, stavo solo sperando che ci sarebbe stato un modo in cui potrei forse usarlo più tardi. Il ForEach sembra molto pulito e ho appena saputo di recente. – Melina

risposta

32

Si potrebbe fare qualcosa di simile

add.ForEach(_obj => 
       { 
        _uow.Questions.Add(_obj); 
        Console.WriteLine("TADA"); 
       }); 

Dai un'occhiata agli esempi in Action Delegate

L'esempio seguente dimostra l'uso del delegato azione per stampare il contenuto di un oggetto List. In questo esempio, il metodo Stampa viene utilizzato per visualizzare il contenuto dell'elenco sulla console. Nell'esempio , l'esempio C# dimostra anche l'uso di metodi anonimi per visualizzare i contenuti nella console. Si noti che l'esempio non dichiara esplicitamente una variabile Action. Invece, passa un riferimento a un metodo che accetta un singolo parametro e che restituisce un valore al metodo List.ForEach, il cui singolo parametro è un delegato di Azione. Analogamente, nell'esempio C#, un delegato di azione non viene esplicitamente creato perché la firma del metodo anonimo corrisponde alla firma del delegato di azione prevista dal metodo List.ForEach.

using System; 
using System.Collections.Generic; 

class Program 
{ 
    static void Main() 
    { 
     List<String> names = new List<String>(); 
     names.Add("Bruce"); 
     names.Add("Alfred"); 
     names.Add("Tim"); 
     names.Add("Richard"); 

     // Display the contents of the list using the Print method. 
     names.ForEach(Print); 

     // The following demonstrates the anonymous method feature of C# 
     // to display the contents of the list to the console. 
     names.ForEach(delegate(String name) 
     { 
      Console.WriteLine(name); 
     }); 

     names.ForEach(name => 
     { 
      Console.WriteLine(name); 
     }); 
    } 

    private static void Print(string s) 
    { 
     Console.WriteLine(s); 
    } 
} 
/* This code will produce output similar to the following: 
* Bruce 
* Alfred 
* Tim 
* Richard 
* Bruce 
* Alfred 
* Tim 
* Richard 
*/ 
+0

Così semplice. :) grazie –

1

utilizzare un'istruzione foreach

foreach (Question q in add) 
{ 
    _uow.Questions.Add(q); 
    q.AssignedDate = DateTime.Now; 
} 

o come Astander propongono fare _obj.AssignedDate = DateTime.Now; nel .ForEach( metodo

2
foreach(var itemToAdd in add) 
{ 
    Do_first_thing(itemToAdd); 
    Do_Second_Thing(itemToAdd); 
} 

o se si vuole insistere su utilizzando il metodo ForEach su List<>

add.ForEach(itemToAdd => 
{ 
    Do_first_thing(itemToAdd); 
    Do_Second_Thing(itemToAdd); 
}); 

Personalmente vorrei andare con il primo, è più chiaro.

1

Molto probabilmente non è necessario fare le cose in questo modo. Basta usare una pianura foreach:

foreach (var question in problem.Questions) 
{ 
    question.AssignedDate = DateTime.Now; 
    _uow.Questions.Add(question); 
} 

A meno che non v'è motivo specifico di utilizzare un lambda, un foreach è più pulita e più leggibile. Come bonus aggiuntivo, non ti obbliga a materializzare la raccolta di domande in un elenco, molto probabilmente riducendo l'impronta di memoria della tua applicazione.

+0

Grazie Jon. Sì, riflettendo, sono d'accordo con te. Tuttavia ho dovuto accettare l'altra risposta in quanto si adatta meglio alla mia domanda. Grazie per il tuo aiuto/consiglio. – Melina

1

Ti piace questa

add.ForEach(_obj => 
        { 
         _obj.AssignedDate = DateTime.Now; 
         _uow.Questions.Add(_obj); 

        }); 
0
add.ForEach(delegate(Question q) 
    { 
     // This is anonymous method and you can do what ever you want inside it. 
     // you can access THE object with q 
     Console.WriteLine(q); 
    }); 
+0

Hai commentato la risposta sbagliata o cosa? Nessun link qui :) – Katu

Problemi correlati