【问题标题】:Populate a given dimension of an array from a LINQ Select从 LINQ Select 填充数组的给定维度
【发布时间】:2012-08-10 02:12:06
【问题描述】:

我想从 LINQ 选择中填充多维数组的给定维度。 循环将是一种明显的方式,但我想要一个“最佳实践”建议。

例如最好的插入方式:

this.Facts.Select(f =>f.FactIc).ToArray()

这会将一个 long 数组返回到该数组的第二维:

long[,] vals = new long[1, factCount];

【问题讨论】:

    标签: c# .net multidimensional-array


    【解决方案1】:

    数组数组呢?如果您发现您经常需要替换 1 整行的内容,那么也许每一行本身应该是一个数组。您甚至可以定义自己的包含行数据的类,然后定义该类的数组。

    顺便说一句,你为什么有 ToList() 和 ToArray()?

    编辑:假设结果必须是二维数组,我将只使用下面的 foreach 版本:

    这样定义 ForEach(这是我最喜欢的扩展方法):

        public static IEnumerable<TSource> ForEach<TSource>(this System.Collections.Generic.IEnumerable<TSource> source, Action<TSource> action)
        {
            ThrowIfNull(source, "source");
            ThrowIfNull(action, "action");
    
            foreach (TSource item in source)
            {
                action(item);
            }
            return source;
        }
    
        public static IEnumerable<TSource> ForEach<TSource>(this System.Collections.Generic.IEnumerable<TSource> source, Action<TSource, int> action)
        {
            ThrowIfNull(source, "source");
            ThrowIfNull(action, "action");
    
            int index = 0;
            foreach (TSource item in source)
            {
                action(item, index);
                index++;
            }
            return source;
        }
    

    那就做吧

    this.Facts.Select(f =>f.FactIc).ForEach((f, i) => vals[1, i] = f);
    

    没有比这更有效的了。开始时数据不在平面数组中,因此您需要以某种方式迭代每个项目并复制数据。这样可以避免制作数组的中间副本等。

    【讨论】:

    • 它实际上进入了 excel 范围,所以我不确定这是否可行。 ToList().ToArray 是一个错字,现在将进行编辑。谢谢
    • @rism 如果是这样的话,那么我想你被二维数组卡住了?这几乎减少了您以某种形式将数据复制到该数组中的选择。您可以使用循环或 Array.Copy。这并不重要,但我认为创建一个数组(使用 ToArray)没有多大意义,只是为了使用 Array.Copy。我将用一种方法编辑我的答案
    猜你喜欢
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多