Сортировать список объектов по изменяющемуся параметру - PullRequest
0 голосов
/ 09 мая 2020

В моем проекте у меня есть этот класс:

public class AccountData
{
    private const string DATE_FORMAT = "dd/MM/yyyy HH:mm";

    private string userName;
    private long creationDate, lastModificationDate;

    public ProjectData()
    {
        this.userName = Environment.UserName;
        creationDate = lastModificationDate = DateTime.Now.Ticks;
    }

    public void UpdateLastModified()
    {
        lastModificationDate = DateTime.Now.Ticks;
    }

    #region Properties
    public string CreationDate => new DateTime(creationDate).ToString(DATE_FORMAT);
    public string LastModificationDate => new DateTime(lastModificationDate).ToString(DATE_FORMAT);
    public string UserName => userName;
    #endregion
}

И мне нужно отобразить список этого класса (System.Generic.List<AccountData>()).

Я могу отобразить его правильно, но я также хочу добавить возможность сортировки данных по одному из параметров. т.е. если пользователь выбрал сортировку по дате создания, все элементы в списке будут отсортированы по этому значению.

Но я не могу найти гибкое решение.

Это то, что У меня так далеко:

private void SortItemsBy(string by)
{
    List<AccountData> accounts = GetAccounts();
    switch (by)
    {
        case "Last Modified":
            Sort(accounts, data => data.LastModificationDate);
            break;
        case "Creation Date":
            Sort(accounts, data => data.CreationDate);
            break;
        case "User Name":
            Sort(accounts, data => data.UserName);
            break;
    }
}

private void Sort(IEnumerable<AccountData> accounts, Func<AccountData, string> predicate)
{
    var orderedAccounts = accounts.OrderBy(predicate);
    DisplayAccounts(orderedAccounts);
}

Как видите, я основываю сортировку на строковом значении, которое (насколько мне известно) подвержено ошибкам.

Есть ли лучший способ сделать это¿

1 Ответ

1 голос
/ 09 мая 2020

Надеюсь, я понял смысл вашего вопроса. Вы можете изменить метод сортировки, включив в него исходный тип данных свойства, которое необходимо отсортировать. Затем вы можете использовать Convert.ChangeType для преобразования строкового свойства в заданный тип. Например,

private void Sort<TDataType>(IEnumerable<AccountData> accounts, Func<AccountData, string> predicate)
{
    var orderedAccounts = accounts.OrderBy(x=> (TDataType)Convert.ChangeType(predicate.Invoke(x),typeof(TDataType),new CultureInfo("en-IN"))); 
    DisplayAccounts(orderedAccounts);
}

Теперь вы можете отсортировать, используя

Sort<string>(list,x=>x.Name);
Sort<DateTime>(list,x=>x.CreationDate);
Sort<DateTime>(list,x=>x.LastModificationDate);

Demo Code

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...