Лучше использовать имя столбца или индекс столбца на.Net DataSets?

Строковый литерал имеет тип string. А new String() имеет тип object. Они не совсем одно и то же. У объектов любого вида в JS могут быть установлены новые свойства; примитивы не могут. Проверьте это сами: выведите typeof "Something" и он скажет, что это строка; но выведите typeof new String("Something") и он скажет, что это объект.

7
задан BalusC 29 March 2010 в 12:42
поделиться

11 ответов

Я обычно предпочитаю удобочитаемость и понимающий по скорости. Пойдите с именем. Вы могли (должен) использовать строковые константы, которые могут быть обновлены в одном месте, если Вы решаете изменить имена столбцов базы данных.

13
ответ дан 6 December 2019 в 05:08
поделиться

Доступ к значениям столбцов/строки через имена столбцов лучше для чтения человека и для прямой совместимости (если в будущем кто-то заявка на изменение или количество столбцов).

Значения столбцов/строки Accissing через индексы столбца лучше для производительности.

Так, если Вы хотите изменение некоторое значение в one/two/..... строки, имена столбцов в порядке. Но если Вы хотите изменение некоторое значение в тысячах строк, необходимо использовать индекс столбца, вычисленный из имени столбца:

int ndxMyColumn = table.Columns.IndexOf( "MyColumn" );
foreach(DataRow record in table.Rows ) {
    record[ndxMyColumn] = 15;
}
10
ответ дан 6 December 2019 в 05:08
поделиться

Я думал бы, что имя столбца является лучшим способом пойти. Легче определить то, что Вы вытягиваете, и порядок столбцов определяется избранным оператором, который мог измениться когда-то в будущем. Вы могли утверждать, что имя столбца могло измениться также, но я буду думать, что это было бы гораздо менее вероятно.

Править:

На самом деле, если бы Вы были действительно изогнуты при использовании индексов столбца, то Вы могли бы создать константы индексов столбца и назвать константу названием столбца. Так:

PRIMARY_KEY_COLUMN_NAME_INDEX = 0

Это, по крайней мере, сделало бы это читаемым.

3
ответ дан 6 December 2019 в 05:08
поделиться

Это зависит от того, в чем Вы нуждаетесь. В моем случае у меня была ситуация, где скорость была главной, поскольку я выполнял интенсивную обработку на тысячах строк в DataSet, таким образом, я принял решение записать часть кода, который кэшировал индексы столбца по имени. Затем в коде цикла я использовал кэшируемые индексы. Это дало разумное увеличение производительности по использованию имени столбца непосредственно.

Ваш пробег может варьироваться, конечно. Моя ситуация была скорее изобретенным и необычным случаем, но в том экземпляре она работала скорее хорошо.

2
ответ дан 6 December 2019 в 05:08
поделиться

Мое мнение - то, что необходимо только переключиться на индексы, если бы Вы представили свой код, и он показал узким местом. Я не думаю, что это произойдет.

Именование материала хорошо, это заставляет наш ограниченный мозг понять проблемы и создать легче ссылки. Вот почему мы - имена, такие как Fred, Martin, Jamie, а не Человек [189333847], Человек [138924342] и Человек [239333546].

2
ответ дан 6 December 2019 в 05:08
поделиться

Пойдите с именем, Вы получаете лучшие сообщения об ошибках :)

1
ответ дан 6 December 2019 в 05:08
поделиться

Если бы Вы действительно решали запутать базу данных путем изменения имен столбцов в будущем, то Вы могли исказить те столбцы в своем запросе для хранения кода индексатора функциональным. Я предлагаю индексировать по имени.

1
ответ дан 6 December 2019 в 05:08
поделиться

Я выбираю строки для простоты чтения и пригодности для обслуживания. Я использую строку contstants для определения значений имен столбцов. Исключая:

public class ExampleDataColumns
{
    public const string ID = "example_id";
    public const string Name = "example_name";
    ....    
}

Затем я могу сослаться на него позже как это:

row[ExampleDataColumns.ID]
1
ответ дан 6 December 2019 в 05:08
поделиться

Используйте имена столбцов для DataRow к тому же, что RDBMS не получит скорость, требуя, чтобы программисты указали индекс столбца в SQL. Но можно, возможно, подражать способу, которым работает RDBMS, когда Вы делаете заявление SELECT, в механизме RDBMS это запрашивает столбец, index/offset из столбцов, указанных в ИЗБРАННОМ пункте перед ним, пересекают строки, таким образом, это может работать быстрее.

Если Вы действительно хотите получить скорость, не делайте этого константа/перечисление путь (порядок столбцов мог бы измениться на Вашей базе данных или уровне ORM). Сделайте это как предложенный TcKs (перед фактическим циклом):

int ndxMyColumn = table.Columns.IndexOf( "MyColumn" );
foreach(DataRow record in table.Rows ) {
    record[ndxMyColumn] = 15;
}
1
ответ дан 6 December 2019 в 05:08
поделиться

для меня я использую отражение (не уверенный, что это - корректный способ назвать то, что я делаю) получить columnnameColumn от таблицы

никакое "жесткое кодирование" не лучше

  int price = (int)dr[DatableVar.PriceColumn];
0
ответ дан 6 December 2019 в 05:08
поделиться

Полностью агресс с другими идти на читабельность и ремонтопригодность по скорости. У меня, однако, имел общий метод, который, необходимый для того, чтобы быть названным столбцами, переданными в качестве параметров, поэтому имел смысл разработать то, что были индексы столбцов.

В бенчмаркеринге ниже используя индекс столбца показал большое улучшение, поэтому, если это область узкого места или важная ваша часть вашего кода, она может быть полезной.

Вывод из кода ниже:

515МС с Columnindex

1031MS с столбцем

    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;
    }
4
ответ дан 6 December 2019 в 05:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: