SortedList? 还是用List 的 List.Sort()吧!

来源:互联网 发布:免费洗衣软件 编辑:程序博客网 时间:2024/06/06 04:50

 

在利用.NetFramework编程的时候。

SortedList对于规模比较小的索引应用上,真的比较方面。但是随着规模的增长,这将会变成一场噩梦——时间的消耗比简单的插入排序还恐怖(实际上它就变成了插入排序);

算了,还是用List吧,List.Sort()据说利用的是带有一堆检查机制的QuickSort(快速排序),尤其是对于比较小的数组,速度可以超过手写的普通QuickSort。

 

参见(http://www.pin5i.com/showtopic-24424.html)

 

但是对于索引/查找的应用,有Key和Value两个域。排序是对于一个域进行的。

解决方法很简单:

1. 建立包含Key和Value作为成员变量的类C_Ele

2. 链表:List<C_Ele>

3. 重写List.Sort()需要用到的比较函数:public class DinoComparer: IComparer<string>
4. 使用的时候,DinoComparer dc = new DinoComparer(); myList.Sort(dc);

 

参考(http://msdn.microsoft.com/zh-cn/library/234b841s(VS.85).aspx)

 

C#
复制代码
using System;using System.Collections.Generic;public class DinoComparer: IComparer<string>{    public int Compare(string x, string y)    {        if (x == null)        {            if (y == null)            {                // If x is null and y is null, they're                // equal.                 return 0;            }            else            {                // If x is null and y is not null, y                // is greater.                 return -1;            }        }        else        {            // If x is not null...            //            if (y == null)                // ...and y is null, x is greater.            {                return 1;            }            else            {                // ...and y is not null, compare the                 // lengths of the two strings.                //                int retval = x.Length.CompareTo(y.Length);                if (retval != 0)                {                    // If the strings are not of equal length,                    // the longer string is greater.                    //                    return retval;                }                else                {                    // If the strings are of equal length,                    // sort them with ordinary string comparison.                    //                    return x.CompareTo(y);                }            }        }    }}public class Example{    public static void Main()    {        List<string> dinosaurs = new List<string>();        dinosaurs.Add("Pachycephalosaurus");        dinosaurs.Add("Amargasaurus");        dinosaurs.Add("Mamenchisaurus");        dinosaurs.Add("Deinonychus");        Display(dinosaurs);        DinoComparer dc = new DinoComparer();        Console.WriteLine("/nSort with alternate comparer:");        dinosaurs.Sort(dc);        Display(dinosaurs);        SearchAndInsert(dinosaurs, "Coelophysis", dc);        Display(dinosaurs);        SearchAndInsert(dinosaurs, "Oviraptor", dc);        Display(dinosaurs);        SearchAndInsert(dinosaurs, "Tyrannosaur", dc);        Display(dinosaurs);        SearchAndInsert(dinosaurs, null, dc);        Display(dinosaurs);    }    private static void SearchAndInsert(List<string> list,         string insert, DinoComparer dc)    {        Console.WriteLine("/nBinarySearch and Insert /"{0}/":", insert);        int index = list.BinarySearch(insert, dc);        if (index < 0)        {            list.Insert(~index, insert);        }    }    private static void Display(List<string> list)    {        Console.WriteLine();        foreach( string s in list )        {            Console.WriteLine(s);        }    }}/* This code example produces the following output:PachycephalosaurusAmargasaurusMamenchisaurusDeinonychusSort with alternate comparer:DeinonychusAmargasaurusMamenchisaurusPachycephalosaurusBinarySearch and Insert "Coelophysis":CoelophysisDeinonychusAmargasaurusMamenchisaurusPachycephalosaurusBinarySearch and Insert "Oviraptor":OviraptorCoelophysisDeinonychusAmargasaurusMamenchisaurusPachycephalosaurusBinarySearch and Insert "Tyrannosaur":OviraptorCoelophysisDeinonychusTyrannosaurAmargasaurusMamenchisaurusPachycephalosaurusBinarySearch and Insert "":OviraptorCoelophysisDeinonychusTyrannosaurAmargasaurusMamenchisaurusPachycephalosaurus */