按属性排序对象列表C#(自定义排序顺序)

时间:2017-03-31 14:54:30

标签: c# algorithm list sorting

我目前有一个对象列表,我正在尝试对自定义网格视图进行排序。我希望我能在不创建多个自定义算法的情况下实现它。目前我有一个名为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>();

1 个答案:

答案 0 :(得分:0)

我不确定你究竟在问什么;为什么你不能在你的第一个代码示例中使用Linq表达式?除了OrderBy之外还有OrderByDescending,因此您可以根据需要混合和匹配排序顺序。