2

我有一个类类型的列表集合,类包含以下属性。

class mymodel()
{
 public string Name{ get; set; }
 public string AMPM{ get; set; }
}
List<mymodel> mylist;

AMPM 属性应包含“AM”或“PM”或“MIX”或“--”

我需要对我的列表集合进行排序,使 AM 值位于顶部,然后是 PM 值,然后是 Mix,然后是“--”值

如何使用 Lambda 订购此列表集合?

4

7 回答 7

5

您可以添加其他属性。

class mymodel {
    public string Name{ get; set; }
    public string AMPM{ get; set; }
    public int AMPM_Sort {
        get {
            if (AMPM == "AM")   return 1;
            if (AMPM == "PM")   return 2;
            if (AMPM == "MIX")  return 3;
            if (AMPM == "--")   return 4;
            return 9;
        }
    }
}
List<mymodel> mylist;
var sorted = mylist.OrderBy(x => x.AMPM_Sort);
于 2013-08-14T06:20:30.867 回答
2

IComparable<T>在您的班级和覆盖中实施CompareTo(),定义您的优先顺序。之后使用 Lambda 表达式为:OrderBy(x => x);

class mymodel : IComparable<mymodel>
{
    public string AMPM { get; set; }

    public int System.IComparable<mymodel>.CompareTo(mymodel other)
    {
        int MyVal = AMPM == "AM" ? 1 : AMPM == "PM" ? 2 : AMPM == "MIX" ? 3 : 4;
        int OtherVal = other.AMPM == "AM" ? 1 : other.AMPM == "PM" ? 2 : other.AMPM == "MIX" ? 3 : 4;

        return MyVal.CompareTo(OtherVal);
 }

}

现在你可以简单地做mylist.OrderBy(x => x). 即使是简单的mylist.Sort()也可以。

于 2013-08-14T06:24:23.377 回答
2

基于 Maarten 解决方案,我会通过这种方式优化排序

    class mymodel
    {
        private string _ampm;
        public string Name{ get; set; }
        public string AMPM
        {
            get { return _ampm; }
            set 
            {
                _ampm = value;
                AMPM_Sort = AppropriateSort();
            }
        }

        public int AMPM_Sort { get; private set; }

        private int AppropriateSort()
        {
            if (AMPM == "AM")  return 1;
            if (AMPM == "PM")  return 2;
            if (AMPM == "MIX") return 3;
            return AMPM == "--" ? 4 : 9;
        }
    }
}

List<mymodel> mylist;
var sorted = mylist.OrderBy(x => x.AMPM_Sort);
于 2013-08-14T08:21:03.503 回答
0

您可以编写自定义比较器来确定哪个值更高或更低。

看看这里

于 2013-08-14T06:22:08.467 回答
0

如果您想使用该参数对列表进行排序,则必须创建一个自定义比较器。

using System;
using System.Collections.Generic;

public class CustomComparer: IComparer<mymodel>
{
    public int Compare(mymodel x, mymodel y)
    {
        if (x == null)
        {
            if (y == null)
                return 0;
            else
                return -1;
        }
        // Add the comparison rules.
        // return 0 if are equal.
        // Return -1 if the second is greater.
        // Return 1 if the first is greater
    }
}

排序调用是:

List<mymodel> mylist;
CustomComparer cc = new CustomComparer();
mylist.Sort(cc);
于 2013-08-14T06:23:34.033 回答
0

你必须重写类的 Equal & GetHashCode 方法,然后你可以在一个列表中对其进行排序。

于 2013-08-14T06:40:28.820 回答
-1

您可以将扩展方法“OrderBy”与 lambda 表达式一起使用。

 var collection = new List<Mymodel> {new Mymodel {AMPM = "AM", Name = "Test1"},
        new Mymodel {AMPM = "PM", Name = "Test2"},
        new Mymodel {AMPM = "AM", Name = "Test3"},
        new Mymodel {AMPM = "PM", Name = "Test4"}};

        var sorted = collection.OrderBy(p => p.AMPM);
于 2013-08-14T06:25:44.203 回答