C#, DataTable. Как получить Row по «id»?

Мне нужно получить строку таблицы из Dataset, т.е. строку таблицы DataTable, в которой есть уникальное поле id. Причем id это не автоинкриментируемое число, а текстовая строка. Я знаю о методе Select. Но раз колонка уникальна, то почему бы не адрессоваться к ней как это делается в HashTable? Можно ли не пользуясь селектом сразу получить искомый DataRow прямо по его уникальному ID? Если нельзя, то сильно ли медленнее в данном случае будет работать Select, чем, например, работает HashTable, или скорость будет достаточно высокой поскольку поле уникальное?

1 ответов


Если ID - первичный ключ, то MSDN (http://msdn.microsoft.com/ru-ru/library/ydd48eyk.aspx) говорит такое:


private void FindInPrimaryKeyColumn(DataTable table,
    long pkValue)
{
    // Find the number pkValue in the primary key
    // column of the table.
    DataRow foundRow = table.Rows.Find(pkValue);

    // Print the value of column 1 of the found row.
    if(foundRow != null)
        Console.WriteLine(foundRow[1]);
}
 

С поправкой на то, что у тебя вместо "long pkValue" будет "string ID"

С DataTable такой фокус не прокатывает, только через DataView можно провернуть поиск.

DataSet ds = new DataSet();
DataTable dt = new DataTable("Table1");

// создаем колонки
dt.Columns.Add("id", typeof(string));
dt.Columns.Add("val", typeof(string));

// задаем PrimaryKey
dt.PrimaryKey = new DataColumn[] { dt.Columns["id"] };

// тестовые данные
dt.Rows.Add(new object[] {"1","one"});
dt.Rows.Add(new object [] {"2", "two"});
dt.Rows.Add(new object[] { "10", "ten" });

ds.Tables.Add(dt);

// собственно поиск
ds.Tables["Table1"].DefaultView.Sort = "id";
DataRowView [] drv = ds.Tables["Table1"].DefaultView.FindRows(10);