在.Net DataSet上使用列名或列索引更好吗?

tpo*_*wer 7 .net obfuscation datarow dataset

从DataRow中检索值时,最好使用列名称还是列索引?

列名更易读,更易于维护:

int price = (int)dr["Price"];
Run Code Online (Sandbox Code Playgroud)

虽然列索引更快(我认为):

int price = (int)dr[3];
Run Code Online (Sandbox Code Playgroud)

如果您决定对数据库进行模糊处理,是否会使用列名中断?

tva*_*son 13

我通常更喜欢可读性和对速度的理解.跟着名字去吧.如果您决定更改数据库列名,则可以(应该)使用可在一个位置更新的字符串常量.


TcK*_*cKs 10

通过列名访问列/行值对于人类阅读和向前兼容性更好(如果将来有人更改顺序或列数).

通过列indeces赋予列/行值更好的性能.

所以,如果你想在一个/两个/ .....行中改变一些值,列名是可以的.但是如果要在数千行中更改某些值,则应使用从列名计算的列索引:

int ndxMyColumn = table.Columns.IndexOf( "MyColumn" );
foreach(DataRow record in table.Rows ) {
    record[ndxMyColumn] = 15;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

完全与他人发生冲突。追求可读性和可维护性而不是速度。然而,我有一个通用方法,需要获取作为参数传入的命名列,因此计算出列索引是什么是有意义的。

在下面的基准测试中,使用列索引显示了很大的改进,因此如果这是代码的瓶颈区域或性能关键部分,那么它可能是值得的。

下面代码的输出是:

515 毫秒(使用 ColumnIndex)

1031 毫秒(使用 ColumnName)

    static void Main(string[] args)
    {            
        DataTable dt = GetDataTable(10000, 500);
        string[] columnNames = GetColumnNames(dt);

        DateTime start = DateTime.Now;
        TestPerformance(dt, columnNames, true);

        TimeSpan ts = DateTime.Now.Subtract(start);
        Console.Write("{0}ms with ColumnIndex\r\n", ts.TotalMilliseconds);

        start = DateTime.Now;
        TestPerformance(dt, columnNames, false);
        ts = DateTime.Now.Subtract(start);
        Console.Write("{0}ms with ColumnName\r\n", ts.TotalMilliseconds);
    }

    private static DataTable GetDataTable(int rows, int columns)
    {
        DataTable dt = new DataTable();

        for (int j = 0; j < columns; j++)
        {
            dt.Columns.Add("Column" + j.ToString(), typeof(Double));
        }

        Random random = new Random(DateTime.Now.Millisecond);
        for (int i = 0; i < rows; i++)
        {
            object[] rowValues = new object[columns];

            for (int j = 0; j < columns; j++)
            {
                rowValues[j] = random.NextDouble();
            }

            dt.Rows.Add(rowValues);
        }

        return dt;
    }

    private static void TestPerformance(DataTable dt, string[] columnNames, bool useIndex)
    {
        object obj;
        DataRow row;

        for (int i =0; i < dt.Rows.Count; i++)
        {
            row = dt.Rows[i];

            for(int j = 0; j < dt.Columns.Count; j++)
            {
                if (useIndex)
                    obj = row[j];
                else
                    obj = row[columnNames[j]];
            }
        }
    }

    private static string[] GetColumnNames(DataTable dt)
    {
        string[] columnNames = new string[dt.Columns.Count];

        for (int j = 0; j < columnNames.Length; j++)
        {
            columnNames[j] = dt.Columns[j].ColumnName;
        }

        return columnNames;
    }
Run Code Online (Sandbox Code Playgroud)