如何在C# LINQ ForEach循环中执行多个操作

43

我有一个问题对象的列表,我使用ForEach循环遍历该列表。对于每个对象,我执行.Add将其添加到我的实体框架中,然后添加到数据库中。

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

我需要修改ForEach中每个对象并将AssignedDate字段设置为DateTime.Now。我能在ForEach循环内部完成吗?


4
只需使用普通的 foreach 语句即可。除非你有特定的理由使用 lambda,但这很不可能,否则你正在使它变得不必要复杂。 - Jon
你可以使用 _obj => { 一堆操作 },但我不建议这样做。简单的 foreach 更加清晰易懂。 - Sergey Berezovskiy
我只是希望以后可能会有一种方法可以使用。ForEach看起来非常干净,我最近才学到这个。 - user1943020
2
@Melina:不,实际上看起来很混乱。好处是你可以在运行时配置要执行的操作,但如果你不利用这个好处,你只会留下一堆混乱的东西。我认为你正在遭受一种情况,就是你刚学了某些东西,想到处使用它。 - Jon
6个回答

82
你可以这样做:

你可以像这样做

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

请查看Action Delegate中的示例。

以下示例演示了使用Action委托打印List对象内容。在该示例中,Print方法用于将列表内容显示到控制台。此外,C#示例还演示了使用匿名方法将内容显示到控制台。请注意,示例未显式声明Action变量。相反,它将对单个参数且不返回值的方法的引用传递给List.ForEach方法,该方法的单个参数是Action委托。同样,在C#示例中,因为匿名方法的签名与List.ForEach方法期望的Action委托的签名相匹配,所以不需要显式实例化Action委托。

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
 */

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

或者,如果您坚持使用 List<> 上的 ForEach 方法

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

个人而言,我会选择第一个选项,因为它更加清晰易懂。


2

很可能您不需要以这种方式处理事情。只需使用简单的foreach

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

除非有特定的原因需要使用lambda表达式,否则foreach更加简洁易读。额外的好处是它不会强制将问题集合转换为列表,很可能减少应用程序的内存占用。


谢谢Jon。反思后,我同意你的观点。然而,我不得不接受其他答案,因为它最符合我的问题。感谢你的帮助/建议。 - user1943020

0
使用 foreach 语句。
foreach (Question q in add)
{
   _uow.Questions.Add(q);
   q.AssignedDate = DateTime.Now;
}

或者像一个标准建议那样,在.ForEach(方法中写入_obj.AssignedDate = DateTime.Now;


0

像这样

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接