Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按不同参数对对象列表进行排序_C#_Linq - Fatal编程技术网

C# 按不同参数对对象列表进行排序

C# 按不同参数对对象列表进行排序,c#,linq,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 = Environmen

在我的项目中,我有以下课程:

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

我能够正确地显示它,但我还想添加一个选项,以按其中一个参数对数据进行排序。i、 e.如果用户选择了sort by 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);
}
private void SortItemsBy(字符串依据)
{
List accounts=GetAccounts();
开关(通过)
{
案例“上次修改”:
排序(账户、数据=>data.LastModificationDate);
打破
案例“创建日期”:
排序(accounts,data=>data.CreationDate);
打破
案例“用户名”:
排序(帐户、数据=>data.UserName);
打破
}
}
私有无效排序(IEnumerable帐户,Func谓词)
{
var orderedAccounts=accounts.OrderBy(谓词);
显示账户(订单账户);
}
正如您所看到的,我是基于一个字符串值进行排序的,据我所知,这个字符串值很容易出错


有更好的方法吗?

我希望我理解你的问题。可以修改排序方法以包含需要排序的属性的原始数据类型。然后可以使用将字符串属性转换为所需类型。比如说,

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

private void排序(IEnumerable

您是否只是希望能够通过将所有内容转换为字符串来进行排序?还是仅仅是为了进行排序?您是否有任何理由使用
字符串来表示
日期时间
字段?这是一种难以置信的限制-
字符串
用于显示,但这些属性的任何其他用途都将受到限制再次将它们转换回
DateTime
。@RufusL否,该属性仅用于显示它。排序将按DateTime进行class@RossGurbutt不,这只是为了测试代码是否有效。我会使用对象的读取类型(例如,创建数据作为DateTime)您是否考虑过将谓词的返回类型设置为泛型,然后使用
DateTime
类将实际是日期的字符串属性解析为
DateTime
对象?然后排序应该按预期进行。
Sort<string>(list,x=>x.Name);
Sort<DateTime>(list,x=>x.CreationDate);
Sort<DateTime>(list,x=>x.LastModificationDate);