我目前有一个对象列表,我正在尝试对自定义网格视图进行排序。我希望我能在不创建多个自定义算法的情况下实现它。目前我有一个名为on page load的方法,按客户名称排序列表,然后是状态。我有一个自定义的状态订单(新的,正在进行中,有问题,已完成,已存档),无论使用哪种(客户,日期等),它都应按正确的顺序对状态进行排序。例如:
我有两个客户,每个客户有两个订单,第一个客户是Betty White,第二个是Mickey Mouse。目前,贝蒂有一个新的订单,一个已完成的订单和米奇有一个正在进行的订单,另一个有问题。所以显示顺序应为:
Betty,New :: Betty,已完成
米奇,正在进行中::米奇,有问题
我目前正在使用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>();
答案 0 :(得分:0)
我不确定你究竟在问什么;为什么你不能在你的第一个代码示例中使用Linq表达式?除了OrderBy之外还有OrderByDescending,因此您可以根据需要混合和匹配排序顺序。