C # Сортировать список по его свойству, которое является строкой datetime

#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));