#c# #list #sorting
#c# #Список #сортировка
Вопрос:
У меня есть список, каждый элемент этого списка является определяемым пользователем классом, который имеет свойство, тип которого — string, но его содержимое — datetime, например, следующее;
StringAsDate=»23/10/2020 17:12:00″
класс неизвестен{ …, StringAsDate, … }
список списка T
Я хочу отсортировать список по убыванию, который является строкой, содержащей дату и время контейнера, я должен сохранить формат списка в конце.
Я могу сделать это грубой силой, но я ищу эффективный и элегантный способ.
Спасибо.
Ответ №1:
Основываясь на ваших комментариях к ответам, вы ищете решение, основанное на отражении.
Часть отражения, чтобы получить значение свойства на основе имени:
x.GetType().GetProperty(propertyName).GetValue(x, null)
Попробуйте это:
var propetyName = "StringAsDate";
var listSorted = list.OrderByDescending(x => DateTime.Parse(Convert.ToString(x.GetType().GetProperty(propertyName).GetValue(x, null))));
Если Property
уже имеет тип DateTime
, приведения будет достаточно
var propetyName = "StringAsDate";
var listSorted = list.OrderByDescending(x => (DateTime)x.GetType().GetProperty(propertyName).GetValue(x, null));
Ответ №2:
List<Uknown> list
= пример для вашего списка, содержащего объекты.
List<Uknown> sorted = list.OrderByDescending(x => DateTimeParse(x.StringAsDate));
Комментарии:
1. это хорошо, но на самом деле мы можем получить доступ к имени поля в виде строки, поэтому нам нужно получить доступ к полю по его имени, я имею в виду, что у меня есть строковое значение, которое является именем поля, поэтому я не могу получить к нему прямой доступ
Ответ №3:
Использование LINQ:
List<UnKnown> listSorted = list.OrderByDescending(x=>DateTime.Parse(x.StringAsDate));
Комментарии:
1. У вас опечатка, это
DateTime.Parse
2. это хорошо, но на самом деле мы можем получить доступ к имени поля в виде строки, поэтому нам нужно получить доступ к полю по его имени, я имею в виду, что у меня есть строковое значение, которое является именем поля, поэтому я не могу получить к нему прямой доступ
Ответ №4:
Вы можете создать список object
.
List<object> sorted = list.OrderByDescending(x => DateTime.Parse(d.GetType().GetField("StringAsDate").GetValue(d).ToString())));
При этом ваш код будет работать с любым классом, пока у них есть это поле.
Но в случае, если у вас есть контроль над классами, отправляемыми в вашу коллекцию, я бы посоветовал вам реализовать интерфейс для всех классов ITimeStamp
, а затем
List<ITimeStamp> sorted = list.OrderByDescending(x => DateTime.Parse(x.StringAsDate));