列出<>自己的比较器

net*_*jor 5 c# list comparator

我有一个List,其中元素是:

struct element { 
                double priority; 
                int value; 
               }
Run Code Online (Sandbox Code Playgroud)

如何实现我自己的比较器,允许我按优先级排序List?我尝试使用SortredList ...但它不允许douplicated键:(

非常感谢您的帮助!

Joe*_*orn 10

假设C#3或更高版本:

var sorted = MyList.OrderBy(e => e.priority);
Run Code Online (Sandbox Code Playgroud)


Luk*_*keH 8

您可以使用带有委托的Sort重载来执行就地排序Comparison<T>:

yourList.Sort((x, y) => x.priority.CompareTo(y.priority));
Run Code Online (Sandbox Code Playgroud)

对于旧版本的C#,您需要将lambda替换为old-school delegate语法:

yourList.Sort(
    delegate(element x, element y) { return x.priority.CompareTo(y.priority); });
Run Code Online (Sandbox Code Playgroud)


Isa*_*avo 3

如果您不能依赖 C# 3 扩展或 Lambda,那么您可以让您的结构实现IComparable接口,如下所示:

struct element : IComparable
{
    double priority;
    int value;
    public element(int val, double prio)
    {
        priority = prio;
        value = val;
    }
    #region IComparable Members

    public int CompareTo(object obj)
    {
        // throws exception if type is wrong
        element other = (element)obj;
        return priority.CompareTo(other.priority);
    }

    #endregion
}
Run Code Online (Sandbox Code Playgroud)

该接口也有类型安全版本,但原理是一样的

在结构或类上实现该接口后,调用Sort方法List<>将“正常工作”

static void Main(string[] args)
{
    Random r = new Random();
    List<element> myList = new List<element>();
    for (int i = 0; i < 10; i++)
        myList.Add(new element(r.Next(), r.NextDouble()));
    // List is now unsorted 
    myList.Sort();
    // List is now sorted by priority
    Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)