如何使用线性索引在多维数组中设置值

2024-04-19

使用线性索引在 C# 多维数组中设置值的最有效方法是什么?例如给定一个数组...

int[,,] arr2 = {   {{0,1,2}, {3,4,5}, {6,7,8}}
                , {{9,10,11}, {12,13,14}, {15,16,17}}
                , {{18,19,20}, {21,22,23}, {24,25,26}}
        };

如何使用线性索引将所有元素设置为 30 ...

//This code does not work
for (int i = 0; i < arr.Length; i++)
{
    arr.SetValue(30, i);
}

显然上面的 SetValue() 不适用于多维数组。

这是我能想到的最好的解决方案......

编辑:对代码添加了一些说明...

static class Program
{
    static void Main(string[] args)
    {
        //Sample input. 
        int[,,] arr2 = {   {{0,1,2}, {3,4,5}, {6,7,8}}
                        , {{9,10,11}, {12,13,14}, {15,16,17}}
                        , {{18,19,20}, {21,22,23}, {24,25,26}}
                };

        int[] arr1 = { 1, 2, 3, 4 };

        setElementsTo30(arr2);
        setElementsTo30(arr1);

    }

    //Must be able to process int arrays of arbitrary dimensions and content
    private static void setElementsTo30(Array arr)
    {
        IList<int> cumulativeLength = getCumulativeLengths(arr);

        for (int i = 0; i < arr.Length; i++)
        {
            SetValue(arr, i, 30, cumulativeLength);
        }
    }

    public static void SetValue(this Array arr, int index, object value, IList<int> cumulativeLength)
    {
        int[] arrayIndex = new int[arr.Rank];

        for (int dim = arr.Rank-1; dim >= 0; dim--)
        {
            arrayIndex[dim] = index / cumulativeLength[dim] % arr.GetLength(dim);
        }

        arr.SetValue(value, arrayIndex);
    }

    private static IList<int> getCumulativeLengths(Array arr)
    {
        List<int> lengths = new List<int>(arr.Rank);

        for (int dim = 0; dim < arr.Rank; dim++)
        {
            int prod = 1;
            for (int i = dim + 1; i < arr.Rank; i++)
            {
                prod *= arr.GetLength(i);
            }
            lengths.Add(prod);
        }

        return (IList<int>)lengths;
    }
}

有没有一种方法可以更有效地执行相同的操作,并且可能使用框架本身提供的东西(即可以轻松使用的东西。)

Thanks,
SDX2000。


为什么需要 IList ?

static void SetValue2(this Array a, object value, int i) {
    int[] indices = new int[a.Rank];
    for (int d = a.Rank - 1; d >= 0; d--) {
        var l = a.GetLength(d);
        indices[d] = i % l;
        i /= l
    }
    a.SetValue(value, indices);
}

测试代码:

static void Main(string[] args) {
    int[, ,] arr2 = {   
        {{0,1,2}, {3,4,5}, {6,7,8}}, 
        {{9,10,11}, {12,13,14}, {15,16,17}}, 
        {{18,19,20}, {21,22,23}, {24,25,26}}
    };
    for (int i = 0; i < arr2.Length; i++) {
        arr2.SetValue2(30, i);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用线性索引在多维数组中设置值 的相关文章

随机推荐

  • Windows 服务器上的 PTP 同步(与 Linux 相比) - 可以保证什么精度

    我想知道大家是否知道准确度如何PTP http en wikipedia org wiki Precision Time Protocol在 Windows Server 2008 上可以保证同步 我知道这个线程 Windows 中进程的最
  • 访问 Google Chrome 的缓存

    是否可以从扩展程序中访问 Google Chrome 的缓存 我想编写一个扩展 当无法访问在线页面时 例如互联网连接问题 加载页面的缓存版本 Updated 我知道我可以编写一个可通过扩展访问的 NPAPI 插件来完成此任务 但我不想编写一
  • Firestore 客户和发票,修订后的要求

    这个问题是此处发布的问题的后续问题 Firestore 客户和发票 如何建模 https stackoverflow com questions 50867267 firestore clients and invoices how to
  • C++ 错误:没有调用“print_size”的匹配函数

    我有这个代码 include
  • 为什么函数 printk() 不使用逗号来分隔参数?

    一个例子printk call printk KERN INFO Log message n 也许这个问题更多地是关于C的 因为我之前从未见过C中的函数可以不用逗号分隔参数 这是如何运作的 编译器如何处理这些信息 由于日志级别是一个整数 而
  • 在没有正确原型的情况下调用 printf 是否会引发未定义的行为?

    这个看起来无辜的程序是否会调用未定义的行为 int main void printf d n 1 return 0 是的 调用printf 没有适当的原型 来自标准头
  • python:单行笛卡尔积for循环

    你知道你能做到吗 gt gt gt x y for x in xrange 2 for y in xrange 5 0 0 0 1 0 2 0 3 0 4 1 0 1 1 1 2 1 3 1 4 很整洁 是否有 for 循环版本或者只能对列
  • Flash AS3 - 将多个对象拖放到一个目标?

    标题或多或少是不言自明的 我一直在学习许多不同的教程 而且说实话 我对 AS3 不太擅长 上图显示了我的目标 无论如何 我在我看到的大多数在线教程中注意到 拖放教程要么基于一个对象到一个目标 要么基于多个对象到多个目标 所以我想知道是否有人
  • 如何让php函数每5秒循环一次

    我正在尝试创建一个每秒更新一次的 php 函数 使用 php 本身 没有其他语言 只是纯 PHP 代码 function exp do something 我希望它每秒返回一个值 就像每秒更新一样 对于应用程序服务器 不是 Web 服务器
  • 让 WordPress 使用页面而不是类别

    我做了大量的研究并发现了一些像这样的解决方案 https wordpress stackexchange com questions 106042 force wordpress to show pages instead of categ
  • VS 2008 Addon 暂时禁用/删除所有 catch 块

    是否有任何插件可以暂时禁用所有 catch 块 我正在维护一个应用程序 我需要找出它到底在哪里抛出异常 有人已经完成了错误处理 所有层都完成了 这使我的工作变得艰难 我不知道如何禁用 catch 块 但您想要实现的目标可以通过异常对话框中的
  • 如何设置微调器下拉列表的最大长度?

    我有一个微调器 当前打开时会遮挡微调器下方的一些文本 我需要通过 java 代码或 XML 来限制微调器的最大下拉长度 这样它就不会模糊此文本 The current design is the left example while the
  • 获取错误消息

    我们使用以下代码在验证文档时添加新的错误消息 function addFacesMessage message component try if typeof component string component getComponent
  • Firebase Push() 与 Angularfire $save()

    angularfire save 与 firebase push 相比如何 我知道 Push 在存储数据时会生成一个唯一的密钥 但我无法使用 AngularFire 重新创建该行为 有没有办法或者我应该使用 push 如果是这样 在什么情况
  • 消除在 Swift 中连续绘制 UIBezierPath 期间的滞后延迟

    下面的代码通过覆盖触摸来绘制线条 但是在连续不间断绘制的一段时间内开始出现滞后 手指在屏幕上移动的时间越长 这种滞后就会累积并变得更严重 结果是实际设备上的 CPU 几乎达到极限 CPU 98 并且绘图持续时间越长 生成的图像看起来就越不稳
  • 获取 Disqus html 代码以显示在源代码中以实现 SEO 目的

    最近开始在网站上使用 Disqus 想知道是否有任何方法可以让实际的 html 代码显示在源页面中 我注意到这个网站正在这样做 http adamkaras com blog 2009 06 24 disqus custom css sty
  • 鼠标悬停 div 时弹出消息

    尝试让一个简单的弹出窗口出现mouseover a div我按照答案使用 onmouseover 的描述框 https stackoverflow com questions 3559467 description box on mouse
  • 如何从 java.util.Map 转换为 Scala Map

    Java API 返回一个java util Map
  • 在 Fantasy Football 阵容优化器中添加 Flex 位置

    我编写了一些 R 代码来生成最佳的幻想足球阵容 最大化预计得分 该阵容受到用户输入的名单大小和选秀预算的约束 该数据框基于称为 球员 的数据框 该数据框由球员 位置 幻想点和选秀组成价值 我们的想法是在选秀之前使用这个工具 记住理想的阵容
  • 如何使用线性索引在多维数组中设置值

    使用线性索引在 C 多维数组中设置值的最有效方法是什么 例如给定一个数组 int arr2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 如何使