【发布时间】:2017-03-31 14:54:29
【问题描述】:
我目前有一个对象列表,我正在尝试对自定义网格视图进行排序。我希望我可以在不创建几个自定义算法的情况下实现它。目前我有一个称为页面加载的方法,它按客户名称对列表进行排序,然后是状态。我有一个自定义的状态顺序(新的、进行中的、有问题的、已完成的、存档的),无论使用哪种排序(客户、日期等),它都应该以正确的顺序对状态进行排序。例如:
我有两个客户,每个客户有两个订单,第一个客户是 Betty White,第二个是 Mickey Mouse。目前,Betty 有一个新订单,一个已完成的订单,Mickey 有一个正在处理的订单,另一个有问题。所以显示顺序应该是:
贝蒂,新 :: 贝蒂,已完成
米奇,进行中 :: 米奇,有问题
我目前正在使用Packages.OrderBy(o => o.Customer).ThenBy(o => o.Status)。这可以有效地对客户进行排序,但这并不能消除对状态属性的自定义排序。
实现这一结果的最有效和最标准可接受的方法是什么?
case PackageSortType.Customer:
Packages = Packages.OrderBy(o => o.Customer).ThenBy(o=>o.Status).ToList<Package>();
break;
我之前创建了一个仅按状态排序的方法,但是我相信将 OrderBy 放入该算法只会使最终状态混乱。
private void SortByStatus() {
// Default sort order is: New, In Progress, Has Issues, Completed, Archived
List<Package> tempPackages = new List<Package>();
string[] statusNames = new string[5] { "new", "inProgress", "hasIssue", "completed", "archived" };
string currentStatus = string.Empty;
for (int x = 0; x < 5; x++) {
currentStatus = statusNames[x];
for (int y = 0; y < Packages.Count; y++) {
if (tempPackages.Contains(Packages[y])) continue;
else {
if (Packages[y].Status == currentStatus)
tempPackages.Add(Packages[y]);
}
}
}
Packages.Clear();
Packages = tempPackages;
}
另外,我不确定它是否相关;但是,Packages 列表存储在 Session 中。
编辑
感谢 Alex Paven,我已经解决了自定义排序我的状态的问题。我最终为状态创建了一个新类并使其从 IComparable 派生,然后创建了一个 CompareTo 方法来强制对状态进行正确排序。
对于那些对我提出的解决方案(它仍然需要清理)感到好奇的人,它位于以下:
public class PackageStatus : IComparable<PackageStatus> {
public string Value { get; set; }
int id = 0;
static string[] statusNames = new string[5] { "new", "inProgress", "hasIssue", "completed", "archived" };
public int CompareTo(PackageStatus b) {
if (b != null) {
if (this == b) {
return 0;
}
for (int i = 0; i < 5; i++) {
if (this.Value == statusNames[i]) { id = i; }
if (b.Value == statusNames[i]) { b.id = i; }
}
}
return Comparer<int>.Default.Compare(id, b.id);
}
}
用途:
Packages.OrderBy(o => o.Customer).ThenBy(o => o.Status).ToList<Package>();
【问题讨论】: