C# List的排序问题

在C#中,可以List来代替C++中Vector。

对于LIST的排序,需要使用到Sort()方法,为了让排序方式按照我们自己的想法进行,

可以通过IComparable接口重写CompareTo方法来实现。

例子:

有一个包含人名,年龄等信息的LIST,我们需要根据年龄做从大到小或者从小到大的排序,做法如下:

public class MyInfo:IComparable<MyInfo>//定义MyInfo类,并继承IComparable
{    
    public int age;
    public double value;
    public string name;
    public int CompareTo(MyInfo obj)//重写排序方法,本例中按年龄排序
    {
        int iresult=-1;
        if(this.age==obj.age)
        {
            iresult=0;
        }
        else if(this.age.CompareTo(obj.age)<0)//从小到大排序,如需要从大到小则用>即可
        {
            iresult=1;
        }
        else
        {
            iresult=-1;
        }
        return iresult;
    }
}

调用部分:

List <MyInfo> mystr=new List<MyInfo>();                
            int []agearray=new int[]{20,30,60,14,16,42,34,45,22,31};
            string []names=new string[]{"A","B","C","D","E","F","G","H","I","J"};            
            for(int i=0;i<10;i++)//在List中放入10个数据
            {MyInfo stem=new MyInfo();
                stem.name=names[i];
                stem.age=agearray[i];
                stem.value=i/3;                
            mystr.Add(stem);
            }            
            for(int i=0;i<10;i++)//显示一下排序前的效果          
            {
            lbLog.Items.Add("Name:"+mystr[i].name+",    age:"+mystr[i].age.ToString()+",    Score:"+mystr[i].value.ToString());  
            }
            lbLog.Items.Add("现在进行排序......");
            mystr.Sort();
            //mystr.s
            for(int i=0;i<10;i++)//显示一下排序后的效果
            {
            lbLog.Items.Add("Name:"+mystr[i].name+",    age:"+mystr[i].age.ToString()+",    Score:"+mystr[i].value.ToString());            
            }

运行结果:



### C#List排序方法 在 C# 中,`List<T>` 提供了多种内置的方法来完成排序操作。以下是常见的几种实现方式及其具体示例。 #### 方法一:使用 `Sort()` 方法并结合 Lambda 表达式 这是最常见的一种方式,通过传递一个比较器函数给 `Sort()` 来指定排序逻辑。对于简单的属性比较可以直接使用 `CompareTo` 函数[^1]。 ```csharp // 升序排列 list.Sort((a, b) => a.Value.CompareTo(b.Value)); // 降序排列 list.Sort((a, b) => b.Value.CompareTo(a.Value)); ``` 以上代码展示了如何基于对象的某个属性进行升序或降序排序。注意这里的 `Value` 是假设的对象属性名,实际应用中应替换为目标字段名称。 #### 方法二:自定义 Comparison 委托 当需要更复杂的排序规则时,可以创建自己的 `Comparison<T>` 委托,并将其作为参数传入 `Sort()` 方法[^2]。 ```csharp List<int> tempList = new List<int>() { 2, 3, 9, 3, 4 }; tempList.Sort((a, b) => { if (a > b) return 1; if (a == b) return 0; if (a < b) return -1; return 0; }); string result = ""; foreach (var item in tempList) { result += item + " "; } Console.WriteLine(result); // 输出: 2 3 3 4 9 (从小到大) ``` 此例子演示了一个整数列表按照数值大小顺序重新安排的过程。如果希望获得相反的结果——即从高至低,则只需交换条件中的正负号即可: ```csharp if (a > b) return -1; if (a < b) return 1; ``` #### 方法三:借助 LINQ 进行排序 除了直接调用 `List<T>.Sort()` 外,还可以采用 Language Integrated Query (LINQ) 技术来进行数据查询与处理。这种方式尤其适合于读取只读集合或者不改变原始序列的情况下获取已排序版本的数据集[^3]。 ```csharp using System.Linq; var sortedAscending = myList.OrderBy(x => x.PropertyName).ToList(); var sortedDescending = myList.OrderByDescending(x => x.PropertyName).ToList(); ``` 这里分别实现了按某一特定属性升序 (`OrderBy`) 和降序 (`OrderByDescending`) 排列的功能。最终均转换回新的列表形式存储结果。 --- ### 总结 综上所述,在 C# 编程语言里针对 `List<T>` 类型执行排序任务有三种主流途径可供选择:一是运用默认提供的 `Sort()` 功能配合匿名函数;二是构建专属对比机制提交给该成员函数;三是引入强大的 LINQ 工具箱辅助达成目标。每种方案各有优劣适用于不同场景需求下灵活选用最为合适的技术手段解决问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值