将二维对象数组转换为自定义类型列表的快速方法

时间:2016-03-16 14:02:03

标签: c# arrays performance list type-conversion

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

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变量映射到List的最快最有效的方法是什么?

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

感谢阅读。

1 个答案:

答案 0 :(得分:2)

嗯,你要求的是最快最有效的方式。

好的'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();