C# 语法 - Lambda 表达式示例 - ForEach() over Generic List

Posted

技术标签:

【中文标题】C# 语法 - Lambda 表达式示例 - ForEach() over Generic List【英文标题】:C# Syntax - Example of a Lambda Expression - ForEach() over Generic List 【发布时间】:2010-09-25 05:58:43 【问题描述】:

首先,我知道框架中已有的通用 List<> 类的方法可以迭代 List<>

但是作为一个例子,编写 ForEach 方法来迭代 List<> 的每个对象并在每个对象上执行 Console.WriteLine(object.ToString()) 的正确语法是什么。 将List<> 作为第一个参数,将 lambda 表达式作为第二个参数的东西。

我看到的大多数示例都是作为扩展方法完成的,或者涉及 LINQ。我正在寻找一个简单的方法示例。

【问题讨论】:

【参考方案1】:
public void Each<T>(IEnumerable<T> items, Action<T> action)

    foreach (var item in items)
        action(item);

...并这样称呼它:

Each(myList, i => Console.WriteLine(i));

【讨论】:

酷。现在我看到的 Func 语法在哪里发挥作用? Func 委托是具有返回值的方法的通用委托。 Action 委托是没有返回值的方法的通用委托。这是唯一的区别。 所以在你的情况下,你不需要返回一些东西(来自 console.writeline - 所以 Action 就足够了。 另外,您可以只使用方法组 "Console.WriteLine" 而不是 lambda "i => Console.WriteLine(i)"【参考方案2】:

这是你要求的吗?

int[] numbers =  1, 2, 3 ;
numbers.ToList().ForEach(n => Console.WriteLine(n));

【讨论】:

是的。这个很方便,我用过。 +1。当我问这个问题时,我想我只是想在与泛型一起使用时掌握基本的 C# lambda 语法。 好的,但是我们必须考虑到 ToList() 是一个 O(n) 操作【参考方案3】:

上面的代码也可以用更少的代码写成:

new List<SomeType>(items).ForEach(
    i => Console.WriteLine(i)
);

这将创建一个通用列表并使用 IEnumerable 填充它,然后调用列表对象 ForEach。

【讨论】:

问题是问方法怎么写(不是怎么调用),并指明不想使用LINQ或Extension方法。 这很方便,但创建一个新列表的开销(意味着至少再迭代一次)通常不值得吗?【参考方案4】:
public static void Each<T>(this IEnumerable<T> items, Action<T> action) 
foreach (var item in items) 
    action(item);
 

...并这样称呼它:

myList.Each(x =>  x.Enabled = false; );

【讨论】:

一个加号,用于显示在 Each 中执行多个操作的方式。【参考方案5】:

想要说明的是,如果有人将答案作为扩展方法提供,则不必担心,因为扩展方法只是调用实例方法的一种很酷的方法。我了解您在不使用扩展方法的情况下想要答案。无论方法是定义为静态、实例还是扩展,结果都是一样的。

下面的代码使用接受答案中的代码来定义扩展方法和实例方法,并创建一个单元测试以显示输出相同。

public static class Extensions

    public static void Each<T>(this IEnumerable<T> items, Action<T> action)
    
        foreach (var item in items)
        
            action(item);
        
    


[TestFixture]
public class ForEachTests

    public void Each<T>(IEnumerable<T> items, Action<T> action)
    
        foreach (var item in items)
        
            action(item);
        
    

    private string _extensionOutput;

    private void SaveExtensionOutput(string value)
    
        _extensionOutput += value;
    

    private string _instanceOutput;

    private void SaveInstanceOutput(string value)
    
        _instanceOutput += value;
    

    [Test]
    public void Test1()
    
        string[] teams = new string[] "cowboys", "falcons", "browns", "chargers", "rams", "seahawks", "lions", "heat", "blackhawks", "penguins", "pirates";

        Each(teams, SaveInstanceOutput);

        teams.Each(SaveExtensionOutput);

        Assert.AreEqual(_extensionOutput, _instanceOutput);
    

从字面上看,要将扩展方法转换为实例方法,您唯一需要做的就是删除 static 修饰符和方法的第一个参数。

这个方法

public static void Each<T>(this IEnumerable<T> items, Action<T> action)

    foreach (var item in items)
    
        action(item);
    
 

变成

public void Each<T>(Action<T> action)

    foreach (var item in items)
    
        action(item);
    
 

【讨论】:

【参考方案6】:

您可以遍历列表中的每个字符串,甚至可以使用单个语句在整个泛型中搜索,这使得搜索更容易。

public static void main(string[] args)

List names = new List();

names.Add(“Saurabh”);
names.Add("Garima");
names.Add(“Vivek”);
names.Add(“Sandeep”);

string stringResult = names.Find( name => name.Equals(“Garima”));

【讨论】:

【参考方案7】:

标准:

foreach (Item i in allItems)

   i.FK_ItemStatus_CustomCodeID = itemStatuses.Where(
      x => x.CustomCodeID == i.ItemStatus_CustomCodeID).FirstOrDefault();                        

拉姆达:

allItems.ForEach(
   i => i.FK_ItemStatus_CustomCodeID = 
      itemStatuses.Where(
         x => x.CustomCodeID == i.ItemStatus_CustomCodeID).FirstOrDefault()
      );

【讨论】:

以上是关于C# 语法 - Lambda 表达式示例 - ForEach() over Generic List的主要内容,如果未能解决你的问题,请参考以下文章

jdk 8 lambda表达式 及在Android Studio的使用示例

C# 10 Lambda 语法的改进

C#委托,匿名方法,Lambda,泛型委托,表达式树代码示例

java Lambda表达式

lambda 表达式中的 C# 切换

C# Lambda表达式详细总结