Нет, но, возможно, да.
Вы можете установить свои собственные индексы в DataTable, используя DataView. При изменении таблицы DataView будет перестроен, поэтому индекс всегда должен обновляться.
Я провел несколько стендовых тестов для своего собственного приложения. Я использую DataTable для приближения Boost MultiIndexContainer. Чтобы создать индекс для вызова столбца «Автор», я инициализирую DataTable, а затем DataView ...
_dvChangesByAuthor =
new DataView(
_dtChanges,
string.Empty,
"Author ASC",
DataViewRowState.CurrentRows);
Чтобы затем извлечь данные по автору из таблицы, вы используете функцию FindRows представления ...
dataRowViews = _dvChangesByAuthor.FindRows(author);
List<DataRow> returnRows = new List<DataRow>();
foreach (DataRowView drv in dataRowViews)
{
returnRows.Add(drv.Row);
}
Я создал случайный большой объект DataTable и выполнял запросы с использованием DataTable.Select (), Linq-To-DataSet (с принудительным выполнением путем экспорта в список) и описанным выше методом DataView. Метод DataView победил легко. Linq взял 5000 тиков, Select - более 26000 тиков, DataView - 192 тика ...
LOC=20141121-14:46:32.863,UTC=20141121-14:46:32.863,DELTA=72718,THR=9,DEBUG,LOG=Program,volumeTest() - Running queries for author >TFYN_AUTHOR_047<
LOC=20141121-14:46:32.863,UTC=20141121-14:46:32.863,DELTA=72718,THR=9,DEBUG,LOG=RightsChangeTracker,GetChangesByAuthorUsingLinqToDataset() - Query elapsed time: 2 ms, 4934 ticks; Rows=65
LOC=20141121-14:46:32.879,UTC=20141121-14:46:32.879,DELTA=72733,THR=9,DEBUG,LOG=RightsChangeTracker,GetChangesByAuthorUsingSelect() - Query elapsed time: 11 ms, 26575 ticks; Rows=65
LOC=20141121-14:46:32.879,UTC=20141121-14:46:32.879,DELTA=72733,THR=9,DEBUG,LOG=RightsChangeTracker,GetChangesByAuthorUsingDataview() - Query elapsed time: 0 ms, 192 ticks; Rows=65
Итак, если вам нужны индексы для DataTable, я бы предложил DataView, если вы можете справиться с тем фактом, что индекс перестраивается при изменении данных.