Я смотрел на Dynamic Linq сегодня (установлен в VS через NuGet)... но все примеры, которые я нашел до сих пор, предполагают, что OrderBy должен выполняться по известному имени свойства или столбца; однако я пытаюсь OrderBy поле, которое не сильно типизировано; но фактически ключевое значение объекта строки, которое получено из Словаря; например
class RowValues : Dictionary<string, string>
{
...
}
Таким образом, список, который нужно заказать, представляет собой, в частности, список объектов RowValues, заполненных парами Name, Value. Для данного списка RowValues поле OrderBy может быть любым из ключей записей с именованными парами значений (fyi: я хочу, чтобы поле orderby было задано в файле конфигурации xml в конечном итоге, чтобы упорядочить можно было изменить без повторного развертывания двоичных файлов и т.д).
У меня есть догадка, что решение заключается в написании пользовательской функции заказа, переданной в OrderBy??? Эта функция, очевидно, знает, как получить конкретное значение из объекта RowValues, учитывая имя поля из xml config....?? Ответы, которые я видел до сих пор, показывают передачу строки, которая содержит заказную позицию order by в OrderBy, которая близка к тому, где я хочу быть, но как в моем случае среда выполнения знает, где найти поля, упомянутые в Строка OrderBy??
Вход будет очень оценен, или я полностью неправильно понял функции Dynamic Linq?
Если вы используете динамический LINQ, это будет просто:
var sortColumn = GetConfigValue(...);
var sorted = RowValues.OrderBy(sortColumn);
Конечно, вы можете использовать конкатенированную строку для создания множественного сортировки ("column1, column2 DESC"
). Насколько мне известно, нет специальной функции сортировки, если вы не используете обычный LINQ.
Кроме того, я хотел бы убедиться, что вы знаете характеристики Dynamic LINQ.
Редактировать:
Это то, что вы ищете? Это будет заказывать его на основе значения записи "Ключ" в словаре. Если вам нужно несколько сортировок, вы можете использовать его в цикле с .ThenBy()
void Main()
{
List<RowValues> v = new List<RowValues>();
var key = "Key"; //GetFromConfig();
var v1 = new RowValues();
v1.Add("Key", "1");
v1.Add("3", "5");
var v2 = new RowValues();
v2.Add("Key", "3");
v2.Add("2", "2");
var v3 = new RowValues();
v3.Add("Key", "2");
v3.Add("2", "2");
v.Add(v1);
v.Add(v2);
v.Add(v3);
v.OrderBy(r => r[key]).Dump();
}
class RowValues : Dictionary<string, string>
{
}
Кайл, еще раз спасибо. Извинения за поздний ответ, я перешел от этой проблемы сейчас, но из интереса и вежливости я хотел вернуться и согласиться, что ваш код намного ближе к тому, куда я хотел добраться, но мы потеряли динамический аспект linq. Итак, когда вы вызываете OrderBy и заказываете ключ, я бы хотел передать строку, содержащую команду порядка, например "r [key] desc". Причина в том, что я хотел бы оставить определение о том, в каком направлении приказывать до времени исполнения. Я подозреваю, что они будут выполнены с использованием дерева выражений, возможно? например: здесь