【问题标题】:Fast way to convert a two dimensional object array to a List of custom type将二维对象数组转换为自定义类型列表的快速方法
【发布时间】:2016-07-02 11:10:00
【问题描述】:

我有一个二维对象数组如下:

object[,] twoDimensionalArray = new object[,] 
{ 
    new object[] {"columnHeader1", 1, 2, 3},
    new object[] {"columnHeader2", 4, 5, 6},
    new object[] {"columnHeader3", 7, 8, 9}
};

假设我有一堂课如下:

public class MyCustomObject
{
    public string ColumnHeader{get;set;}
    public int ValueOne{get;set;}
    public int ValueTwo{get;set;}
    public int ValueThree{get;set;}
}

知道我可能要处理数千行可能有一百列,那么将我的 twoDimensionalArray 变量映射到列表的最快和最有效的方法是什么?

有明显的 for 循环,但我猜有更好的方法。

感谢阅读。

【问题讨论】:

  • 我会使用yield return 来限制内存消耗。但这取决于您要在消费者方面做什么。
  • 只需.Select(x => new Whatever { SomeDumbProperty = x.WhoCares }); 并继续前进。 Linq 永远是最好的答案。如果有人告诉你不是这样,那就打他们愚蠢的下巴。
  • 我有一个二维数组的对象你看......你已经有一个问题......你很幸运你没有有一个正则表达式的二维数组...然后你会遇到两个问题:-)。通常不要在 .NET 中使用多维数组。 .NET 并不真正支持它们。它们只是在那里生存下来,因为它们无法被移除,而且年轻的程序员可以通过这种方式使用它们。
  • 等等……这是锯齿数组还是二维数组?因为你在那里混合了符号......如果它是一个锯齿状数组,那么一切都很好(你只需将object[,] twoDimensionalArray = new object[,] 更改为object[][] twoDimensionalArray = new object[][]
  • 如果您可以将输入数组修改为二进制序列化为字节[],您将能够将类更改为结构并在其上使用[StructLayout(LayoutKind.Sequential, Pack = 1)]。然后在不安全的上下文中,您将使用(MyCustomObject*)yourSerializedData。但是我不知道字符串是如何物理存储在 C# 中的。

标签: c# arrays performance list type-conversion


【解决方案1】:

嗯,您要求的是最快和最有效的方法。

好的 ol' for 循环是最快的。毫无疑问。但您仍然应该使用真实数据进行衡量。

两种选择:

    object[,] array = new object[,] 
        { 
            {"columnHeader1", 1, 2, 3},
            {"columnHeader2", 4, 5, 6},
            {"columnHeader3", 7, 8, 9}
        };

    int i, maxI = array.GetLength(0);

    List<MyCustomObject> output = new List<MyCustomObject>();

    // 1 - plain old for        
    for(i = 0; i < maxI; i++) {
        var obj = new MyCustomObject {
            ColumnHeader = (string)array[i,0],
            ValueOne = (int)array[i,1],
            ValueTwo = (int)array[i,2],
            ValueThree = (int)array[i,3]
        };
        output.Add(obj);
    }

    Console.WriteLine(output[0].ColumnHeader);
    Console.WriteLine(output[2].ValueThree);

    // 2 - just the same, with Linq. If you need streaming,
    //     linq lets you return the IEnumerable so you can
    //     do foreach on it
    output = Enumerable.Range(0, array.GetLength(0))
        .Select(idx => new MyCustomObject {
                ColumnHeader = (string)array[idx,0],
                ValueOne = (int)array[idx,1],
                ValueTwo = (int)array[idx,2],
                ValueThree = (int)array[idx,3]
            }).ToList();

【讨论】:

    猜你喜欢
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2023-04-06
    • 1970-01-01
    • 2019-11-01
    • 2020-05-06
    相关资源
    最近更新 更多