Как я могу выполнять несколько операций внутри цикла С# LINQ ForEach

У меня есть список объектов Question, и я использую ForEach для итерации по списку. Для каждого объекта я делаю .Add, чтобы добавить его в мою инфраструктуру сущности, а затем в базу данных.

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

Мне нужно изменить каждый из объектов в ForEach и установить для поля AssignedDate значение DateTime.Now. Есть ли способ сделать это внутри цикла ForEach?

Ответы

Ответ 1

Вы бы сделали что-то вроде

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

Взгляните на примеры в делетете действий

В следующем примере показано использование делегата Action для печати содержимого объекта List. В этом примере Print метод используется для отображения содержимого списка на консоли. В Кроме того, пример С# также демонстрирует использование анонимного методы отображения содержимого на консоль. Обратите внимание, что пример явно не объявляет переменную Action. Вместо этого он проходит ссылка на метод, который принимает один параметр и который делает не возвращать значение методу List.ForEach, чей одиночный параметр является делегатом Action. Аналогично, на примере С# Действие делегата явно не создается, поскольку подпись анонимного метода соответствует сигнатуре Делегию действий, ожидаемый методом 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
 */

Ответ 2

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

или если вы будете настаивать на использовании метода ForEach на List<>

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

Лично я бы пошел первым, это яснее.

Ответ 3

использовать оператор foreach

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

или в качестве свидетеля предложить _obj.AssignedDate = DateTime.Now; в методе .ForEach(

Ответ 4

Скорее всего, вам не нужно так поступать. Просто используйте простой foreach:

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

Если нет особых причин для использования лямбда, foreach является более чистым и более читаемым. В качестве дополнительного бонуса это не заставляет вас материализовать сборник вопросов в список, что, скорее всего, сократит объем памяти вашего приложения.

Ответ 5

Подобно этому

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

                    });

Ответ 6

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);
    });