【问题标题】:Quickest way to write code to loop over all elements of array编写代码循环遍历数组所有元素的最快方法
【发布时间】:2013-08-16 09:52:06
【问题描述】:

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

我们也有类似的数组吗?

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

bool[] buffer = new bool [128];

还有更多的用例

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

【问题讨论】:

  • “传统的 foreach 循环”不会让您更改内容。

标签: c# .net arrays loops collections


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您可以这样做,而不是分配一个值,而是使用它。

            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);
    

    【讨论】:

    • 不,您不能在枚举期间修改 b。
    • 我知道,但这个答案取决于使用情况
    • OP要修改!这就是问题所在。
    • 我不认为 OP 对如何编写 foreach 循环感到困惑,但想知道是否还有其他方法。您的 Linq 示例也可以简化为 buffer.All(b => b)
    【解决方案3】:

    你可以创建一个扩展方法来初始化一个数组,例如:

    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 数组。

    【讨论】:

    • 这对引用类型没有用。
    • 很多东西对引用类型没有用
    • @DanielA.White 如果你想让数组的所有元素都引用同一个对象,这很有用。
    猜你喜欢
    • 1970-01-01
    • 2021-11-18
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    相关资源
    最近更新 更多