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

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

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

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

【问题讨论】:

    标签: c# .net syntax lambda


    【解决方案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()
              );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-12
          • 1970-01-01
          相关资源
          最近更新 更多