Я работаю с набором устаревшего кода DAO, который возвращает IList, где каждая Hashtable представляет собой строку динамически исполняемого SQL-запроса. Например, список может содержать следующие записи/HashTables:Операции Linq против списка хэш-таблиц?
Hashtable1:
Ключ: Column15, Значение: "Jack"
Ключ: Column16, Значение: "Стивенс"
Key: Column18, значение : "7/23/1973"
Ключ: Column25, Значение: "Активный"
Hashtable2:
Ключ: Column15, Значение: "Мелани"
Ключ: Column16, Значение: "Чирок"
Ключ: Column18, Значение: "нулевой"
Key: Column25, Значение: "Неактивный"
Hashtable3:
Ключ: Column15, Значение: "Генри"
Key: Column16, Value: «Черный»
Ключ: Column18, Значение: «3/16/1913»
Ключ: Column25, Значение: «Активный»
Использование статического типа вместо Hashtable это может быть и речи, потому что результат запроса неизвестен во время выполнения; как количество столбцов, так и характер этих столбцов полностью динамичны.
Я хотел бы иметь возможность выполнять операции на основе Linq в этом наборе данных (группировка, заказ и т. Д.), Но я абсолютно не могу понять, как может выглядеть синтаксис. В качестве простого примера предположим, что я хочу отсортировать список по столбцу 15 по убыванию. Лучший синтаксис я придумал это:
var rawGridData = (List<Hashtable>) _listDao.GetListGridContents(listID, null, null);
var sortedGridData = rawGridData.OrderBy(s => s.Keys.Cast<string>().Where(k => k == "Column15"));
Однако это дает исключение при sortedGridData перечисляется: «По крайней мере, один объект должен реализовывать IComparable.»
Я боролся с этой проблемой в течение нескольких дней и рядом с моим остроумием ... пожалуйста, помогите!
Работает отлично. У меня была догадка, что это будет просто супер. Точно так же, как я слишком усложняю простую проблему. Благодаря! –
OP нуждался в порядке убывания, поэтому OrderByDescending был бы подходящим методом. –
Фактически, на самом деле он действительно выполнял операции с его результирующим набором, такие как группировка, сортировка и т. Д. Взаимодействие состояло в том, как проектировать каждый экземпляр ' HashTable' значение, представляющее конкретный столбец, в котором он находился. Таким образом, ключ проектирует каждый экземпляр «HashTable» для этого значения. Остальное - это просто детали. – jason