4

很多时候,我需要遍历数组的所有项目。如果是 List 我会使用 ForEach 扩展方法。

我们对数组也有类似的东西吗?

为了。例如,假设我想声明一个大小为 128 的 bool 数组并将所有成员初始化为 true。

bool[] buffer = new bool [128];

可以有更多的用例

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

4

3 回答 3

8

您可以使用它来初始化数组:

bool[] buffer = Enumerable.Repeat(true, 128).ToArray();

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

于 2013-08-14T12:32:36.580 回答
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 数组。

于 2013-08-14T12:53:12.363 回答
-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);
于 2013-08-14T12:36:58.090 回答