gpt4 book ai didi

c# - c# 中的这个 foreach 是怎么回事?

转载 作者:太空狗 更新时间:2023-10-29 23:02:13 25 4
gpt4 key购买 nike

(编辑:稍微整理一下代码。)

像这样使用 foreach 效果很好。

var a = new List<Vector2>();

a.ForEach(delegate(Vector2 b) {
b.Normalize(); });

然而,以下会导致“方法‘ForEach’没有重载需要 1 个参数”。

byte[,,] a = new byte[2, 10, 10];

a.ForEach(delegate(byte b) {
b = 1; });

最佳答案

我建议您只使用普通的 foreach循环来转换数据。您使用的方法仅存在于 List<T> 上实现,但不在数组上。

使用 foreach 的方法真的没有任何好处,除非出于某种原因你想在方法链中进行数据突变。在那种情况下,您不妨为 IEnumerable<T> 编写自己的扩展方法。 .不过,我不建议这样做。

有一个单独的foreach循环让读者清楚地知道数据突变正在发生。它还消除了为循环的每次迭代调用委托(delegate)的开销。只要它是 IEnumerable,无论集合类型如何,它都可以工作。 (不完全正确,您可以编写自己的枚举数和可枚举数,但这是另一个问题)。

如果您只想进行数据转换(即投影等),请使用 LINQ。

另请记住,使用数组,您将获得 byte 的副本不是引用。您将只修改 byte不是原来的。这是一个输出示例:

int[] numbers = new int[] { 1, 2, 3, 4, 5 };

Array.ForEach(numbers, number => number += 1);

foreach(int number in numbers)
{
Console.WriteLine(number);
}

产生输出:

1 2 3 4 5

如您所见,lambda 中的数字 += 1 没有任何效果。事实上,如果你在一个正常的 foreach 中试过这个循环,你会得到一个编译器错误。

关于c# - c# 中的这个 foreach 是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7931319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com