【问题标题】:Sort List Of Objects By Properties C# (Custom Sort Order)按属性 C# 对对象列表进行排序(自定义排序顺序)
【发布时间】: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>();

【问题讨论】:

    标签: c# algorithm list sorting


    【解决方案1】:

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

    【讨论】:

    • 我没有注意到智能感知中的 OrderByDescending,所以感谢您指出这一点;但是最大的问题是按状态排序;我不确定是否可以将 OrderBy 放入我的状态排序方法而不会弄乱它,有没有办法自定义 OrderBy?因为无论向哪个方向排序,状态顺序都应该保持不变。
    • 但这就是我的意思,既然可以使用 Linq 进行排序,为什么还要让排序如此复杂?
    • 我可以调查一下,非常感谢您的意见!
    • 哦,你的状态是一个字符串,它本质上不能按照你想要的顺序排序。好吧,例如,如果您不能将其更改为枚举,或者不想保留另一个字段进行排序,则可以使用 IComparer 对所需的状态进行排序,然后使用 OderBy(p => p.Status, myStatusComparer)
    • 抱歉延迟响应,我可以将状态转换为枚举;这不会是一个问题。那时我仍然可以使用 Linq 对其进行排序,对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2018-04-19
    • 2019-05-28
    • 2016-05-18
    • 2011-02-16
    相关资源
    最近更新 更多