通过改变参数对对象列表进行排序

时间:2020-05-08 23:44:49

标签: c# linq

在我的项目中,我有这个课程:

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>())。

我能够正确显示它,但是我还想添加一个选项,以按参数之一对数据进行排序。即,如果用户选择了按creationDate排序,则列表中的所有项目都会被该值破坏。

但是我找不到灵活的解决方案。

这是到目前为止我得到的:

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 个答案:

答案 0 :(得分:1)

希望我能理解你的问题的意图。您可以修改排序方法以包括需要排序的属性的原始数据类型。然后可以使用Convert.ChangeType将字符串属性转换为预期的Type。例如,

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