梦想这东西和经典一样,不会因为时间而褪色,反而更显珍贵

C# 对象实现自定义排序的几种方法

2017-6-16 10:57:26 · 197次浏览

C# 对象实现自定义排序的几种方法

问题:

1.C# 对象实现自定义排序的几种方法
2.IComparer,IComparable接口用法,linq
3.异常:未能比较数组中的两个元素

Linq

最方便

List<LornaTestClass> list = new List<LornaTestClass>() 
{ 
    new LornaTestClass(3), 
    new LornaTestClass(1), 
    new LornaTestClass(2) 
};
list = list.OrderBy(p => p.Value).ToList();

实现IComparer接口

定义类型为比较两个对象而实现的方法。
命名空间: System.Collections.Generic
程序集: mscorlib(位于 mscorlib.dll)

实现IComparer接口**Compare(T,?T)**方法。比较两个对象并返回指示一个是否小于、 等于还是大于另一个值。

代码样例:

private static void Main(string[] args)
{
    List<LornaTestClass> list = new List<LornaTestClass>() 
    { 
        new LornaTestClass(3), 
        new LornaTestClass(1), 
        new LornaTestClass(2) 
    };

    Console.WriteLine("Lorna.com.cn测试,排序前:");
    foreach (LornaTestClass lornaTestClass in list)
    {
        Console.WriteLine(lornaTestClass.Value);
    }
    
    IComparer<LornaTestClass> comparer = new LornaTestComparer();
    list.Sort(comparer);

    Console.WriteLine("Lorna.com.cn测试,排序后:");
    foreach (LornaTestClass lornaTestClass in list)
    {
        Console.WriteLine(lornaTestClass.Value);
    }
    Console.ReadKey();
}

public class LornaTestComparer : IComparer<LornaTestClass>
{
    public int Compare(LornaTestClass x, LornaTestClass y)
    {
        return ((LornaTestClass)x).Value - ((LornaTestClass)y).Value;
    }
}


public class LornaTestClass
{
    public LornaTestClass(int a)
    {
        this.Value = a;
    }

    public int Value { get; set; }
}

输出:

Lorna.com.cn测试,排序前:
3
1
2
Lorna.com.cn测试,排序后:
1
2
3

实现IComparable接口

定义通用的比较方法,由值类型或类实现以创建类型特定的比较方法。
命名空间:System
程序集:mscorlib(在 mscorlib.dll 中)

代码样例:

private static void Main(string[] args)
{
    List<LornaTestClass> list = new List<LornaTestClass>() 
    { 
        new LornaTestClass(3), 
        new LornaTestClass(1), 
        new LornaTestClass(2) 
    };

    Console.WriteLine("Lorna.com.cn测试,排序前:");
    foreach (LornaTestClass lornaTestClass in list)
    {
        Console.WriteLine(lornaTestClass.Value);
    }
    list.Sort();

    Console.WriteLine("Lorna.com.cn测试,排序后:");
    foreach (LornaTestClass lornaTestClass in list)
    {
        Console.WriteLine(lornaTestClass.Value);
    }
    Console.ReadKey();
}

public class LornaTestClass : IComparable
{
    public LornaTestClass(int a)
    {
        this.Value = a;
    }

    public int Value { get; set; }

    public int CompareTo(object obj)
    {
        LornaTestClass c = obj as LornaTestClass;
        return this.Value - c.Value;
    }
}

输出

Lorna.com.cn测试,排序前:
3
1
2
Lorna.com.cn测试,排序后:
1
2
3

写在最后

1.本文是Lorna的笔记,如果你觉得以上代码及说明存在问题或者可以改进的地方,请留言告诉我,非常感谢!


与本文相关的文章推荐