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