对比C#的List<T>.ForEach和foreach迭代循环
作者:admin 时间:2023-6-5 18:37:46 浏览:介绍
在 C# 中,你可以通过多种方式迭代列表,例如 for
循环、foreach
循环或使用 LINQ。当你使用一种List<T>
类型时,你甚至还有一个类型,即ForEach
方法,但是此方法并不总是显示与普通 foreach
循环相同的行为。
使用代码
List<T>
(不是 IList<T>
的 ForEach
)方法对存储在列表中的每个对象执行操作。通常它包含读取或修改列表中的每个对象或对列表本身为每个对象执行某些操作的代码。
修改对象本身
以下示例使用一种ForEach
方法迭代集合中所有存储的数字。它从每个数字中减去 10。最后,数字将打印到控制台。它是否有效取决于你使用的数据类型!
List<int> items = new List<int>() { 14, 19 };
items.ForEach(item => item = item - 10);
foreach (int item in items)
{
Console.WriteLine(item);
}
在本例中,控制台中的输出是 14 和 19。如果类型是原始数据类型(.NET 中的结构),则该ForEach
方法不会产生你想要的效果。没想到是这个结果,看了下ForEach
定义就明白了。它不能按设计工作!
//定义 List<T>.ForEach
public void ForEach(Action<T> action)
//定义 Action<T>
public delegate void Action<in T>(T obj)
Int
是一种值类型,这意味着它按值传递给方法。按值表示将对象的副本传递给方法,而不是对象本身。因此,如果传递到方法中的操作ForEach
更改了副本,但不会影响原始对象。所以在我们的示例中,原始的 int
值不会改变。委托Action
也没有可用于更新列表中对象的返回类型。
修改集合
当你使用普通的 foreach
语句时,你无法在遍历集合时添加或删除项目。但是有了List.ForEach
你就可以了,所以下面的代码可以毫无错误地执行。
public class Integer
{
public int Value { get; set; }
public Integer(int value) { Value = value; }
}
public void Sample()
{
List<Integer> items = new List<Integer>()
{
new Integer(14),
new Integer(0),
new Integer(19)
};
items.ForEach(item =>
{
if (item.Value == 0)
{
items.Remove(item);
}
item.Value = item.Value - 10;
});
foreach (Integer item in items)
{
Console.WriteLine(item.Value);
}
}
控制台显示的结果是 4 和 19。所以这是一个很好的例子,不是所有你能做的,你也应该做!另一种方法,删除一个项目,效果很好。似乎在内部使用了向后迭代,因此删除有效,添加无效。
总结
因此,如果你想在通用列表中存储结构对象,如 int
、long
、double
、bool
甚至 string
,如果你想避免出现问题,你应该使用普通的 foreach
(或 for
)。同样在 ForEach
方法中删除项目也是应该尽可能避免的事情。
参考:List<T>.For Each(Action<T>) 方法
定义
命名空间:System.Collections.Generic
集合:System.Collections.dll
对List<T>
的每个元素执行指定的操作。
public void ForEach (Action<T> action);
参数
action:Action<T>
Action<T>
委托执行List<T>
的每个元素。
异常
ArgumentNullException
action
是null。
InvalidOperationException
集合中的一个元素已被修改。
例子
下面的示例演示了如何使用Action<T>
委托打印List<T>
对象的内容。在此示例中,Print
方法用于将列表的内容显示到控制台。
笔记
除了使用Print
方法显示内容外,C# 示例还演示了使用匿名方法将结果显示到控制台。
List<string> names = new List<string>();
names.Add("Bruce");
names.Add("Alfred");
names.Add("Tim");
names.Add("Richard");
// 使用“打印”方法显示列表的内容。
names.ForEach(Print);
// 下面演示了C#的匿名方法特性,以向控制台显示列表的内容。
names.ForEach(delegate(string name)
{
Console.WriteLine(name);
});
void Print(string s)
{
Console.WriteLine(s);
}
/* 此代码将产生类似于以下内容的输出:
* Bruce
* Alfred
* Tim
* Richard
* Bruce
* Alfred
* Tim
* Richard
*/
解释
Action<T>
是方法的委托,该方法对传递给它的对象执行操作。当前List<T>
的元素分别传递给Action<T>
委托。
此方法是 O( n ) 操作,其中n是Count。
不支持修改Action<T>
委托主体中的基础集合,这会导致未定义的行为。
相关文章
标签: foreach List.ForEach for
- 站长推荐