最快的编写代码循环遍历数组的方法

4
许多时候我需要遍历数组中的所有项。 如果它是List,我会使用ForEach扩展方法。
我们对数组有类似的东西吗?
例如,假设我想声明一个大小为128的bool数组,并将所有成员初始化为true。
bool[] buffer = new bool [128];

有很多其他的用例。

现在将其初始化为true。是否有扩展方法,还是需要编写传统的foreach循环?


传统的foreach循环不能让您更改内容。 - H H
3个回答

8
您可以使用以下方式初始化数组:
bool[] buffer = Enumerable.Repeat(true, 128).ToArray();

但总的来说,不会。我不会使用Linq来编写任意循环,只用于查询数据(毕竟它被称为语言集成查询)。


1
你可以创建一个扩展方法来初始化数组,例如:
public static void InitAll<T>(this T[] array, T value)
{
    for (int i = 0; i < array.Length; i++)
    {
        array[i] = value;
    }
}

并按以下方式使用它:

bool[] buffer = new bool[128];
buffer.InitAll(true);

编辑:

为了解决一些人担心这对于引用类型不够有用的问题,扩展这个概念非常简单。例如,您可以添加一个重载。

public static void InitAll<T>(this T[] array, Func<int, T> initializer)
{
    for (int i = 0; i < array.Length; i++)
    {
        array[i] = initializer.Invoke(i);
    }
}

Foo[] foos = new Foo[5];
foos.InitAll(_ => new Foo());
//or
foos.InitAll(i => new Foo(i));

这将创建5个新的Foo实例并将它们分配给foos数组。

这在引用类型中没有用处。 - Daniel A. White
2
很多东西对于引用类型并不实用。 - Patrick McDonald
@DanielA.White 如果你想让数组的所有元素引用相同的对象,这是非常有用的。 - p.s.w.g

-3

你可以这样做,不是为了赋值而是为了使用它。

        bool[] buffer = new bool[128];
        bool c = true;
        foreach (var b in buffer)
        {
            c = c && b;
        }

或者使用 Linq:

        bool[] buffer = new bool[128];
        bool c = buffer.Aggregate(true, (current, b) => current && b);

2
不可以在枚举过程中修改b。 - Marcus
我知道,但这个答案取决于使用情况。 - Daniel
1
OP想要修改!这就是问题。 - Marcus
我认为 OP 不困惑如何编写“foreach”循环,而是想知道是否有另一种方法。另外,您的 Linq 示例可以简化为 buffer.All(b => b) - p.s.w.g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接