C# 用于对我的列表集合排序(排序)的Lambda表达式

C# 用于对我的列表集合排序(排序)的Lambda表达式,c#,c#-4.0,C#,C# 4.0,我有一个类类型的列表集合,该类包含以下属性 class mymodel() { public string Name{ get; set; } public string AMPM{ get; set; } } List<mymodel> mylist; classmymodel() { 公共字符串名称{get;set;} 公共字符串AMPM{get;set;} } 列出我的清单; AMPM属性应包含“AM”或“PM”或“MIX”或“-” 我需要对列表集合进行排序,使AM值排

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

class mymodel()
{
 public string Name{ get; set; }
 public string AMPM{ get; set; }
}
List<mymodel> mylist;
classmymodel()
{
公共字符串名称{get;set;}
公共字符串AMPM{get;set;}
}
列出我的清单;
AMPM属性应包含“AM”或“PM”或“MIX”或“-”

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


如何使用Lambda对列表集合进行排序?

您可以添加其他属性

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);
classmymodel{
公共字符串名称{get;set;}
公共字符串AMPM{get;set;}
公共整数AMPM_排序{
得到{
如果(AMPM==“AM”)返回1;
如果(AMPM=“PM”)返回2;
如果(AMPM==“混合”)返回3;
如果(AMPM==“--”)返回4;
返回9;
}
}
}
列出我的清单;
var sorted=mylist.OrderBy(x=>x.AMPM\u Sort);

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


查看一下

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

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
    }
}
使用系统;
使用System.Collections.Generic;
公共类CustomComparer:IComparer
{
公共整数比较(mymodel x、mymodel y)
{
如果(x==null)
{
如果(y==null)
返回0;
其他的
返回-1;
}
//添加比较规则。
//如果值相等,则返回0。
//如果第二个更大,则返回-1。
//如果第一个大于1,则返回1
}
}
排序调用是:

List<mymodel> mylist;
CustomComparer cc = new CustomComparer();
mylist.Sort(cc);
列出mylist;
CustomComparer cc=新的CustomComparer();
mylist.Sort(cc);

在类上实现
IComparable
,并在
CompareTo()
覆盖中定义您的优先顺序。然后使用Lambda表达式作为:
OrderBy(x=>x)

classmymodel:i可比较
{
公共字符串AMPM{get;set;}
public int System.IComparable.CompareTo(mymodel其他)
{
int MyVal=AMPM==“AM”?1:AMPM==“PM”?2:AMPM==“混合”?3:4;
int OtherVal=other.AMPM==“AM”?1:other.AMPM==“PM”?2:other.AMPM==“MIX”?3:4;
返回MyVal.CompareTo(其他值);
}
}


现在您只需执行
mylist.OrderBy(x=>x)
。即使是一个简单的mylist.Sort()
也可以。

您可以将扩展方法“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);
var collection=new List{new Mymodel{AMPM=“AM”,Name=“Test1”},
新的Mymodel{AMPM=“PM”,Name=“Test2”},
新的Mymodel{AMPM=“AM”,Name=“Test3”},
新的Mymodel{AMPM=“PM”,Name=“Test4”};
var sorted=collection.OrderBy(p=>p.AMPM);

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

基于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);
classmymodel
{
私有字符串_ampm;
公共字符串名称{get;set;}
公共字符串AMPM
{
获取{return\u ampm;}
设置
{
_ampm=值;
AMPM_Sort=适当排序();
}
}
公共int-AMPM_排序{get;私有集;}
私有整数排序()
{
如果(AMPM==“AM”)返回1;
如果(AMPM=“PM”)返回2;
如果(AMPM==“混合”)返回3;
返回AMPM==“-”?4:9;
}
}
}
列出我的清单;
var sorted=mylist.OrderBy(x=>x.AMPM\u Sort);

设置AMPM字符串时,我会优化您的代码并设置AMPM_排序值。对于长列表,排序速度会更快。(公共字符串AMPM{get{return}AMPM;}set{{u AMPM=value;_AMPM_Sort=property_value;}}+1.非常简单。实际上没有那么简单。我已经创建了一个小测试程序来对两个版本进行性能测试,结果表明您的更改在这种情况下没有什么不同。以发行版的形式构建,并从命令行运行。来源:结果:这取决于您的应用程序。如果您必须对一个大列表进行排序(100个000个项目)很多次。你可以考虑这个选项。否则,你是对的,我是同意的。
    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);