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这是你要求的吗?
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的使用示例