列表与LT;>自己的比较

时间:2010-03-24 16:23:37

标签: c# list comparator

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

struct element { 
                double priority; 
                int value; 
               }

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

非常感谢您的帮助!

5 个答案:

答案 0 :(得分:11)

假设C#3或更晚:

var sorted = MyList.OrderBy(e => e.priority);

答案 1 :(得分:8)

您可以使用Sort overload代表的Comparison<T>执行就地排序:

yourList.Sort((x, y) => x.priority.CompareTo(y.priority));

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

yourList.Sort(
    delegate(element x, element y) { return x.priority.CompareTo(y.priority); });

答案 2 :(得分:3)

如果您不能依赖C#3扩展或Lambdas,那么您可以让您的结构实现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
}

这个界面也有typesafe version,但原理是相同的

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

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();
}

答案 3 :(得分:2)

这取决于您是要对列表本身进行排序,还是按排序顺序检索值(不更改列表)。

要对列表本身进行排序(假设您有一个名为List<element>的{​​{1}}):

elements

.NET 2.0等价物:

elements.Sort((x, y) => x.priority.CompareTo(y.priority));
// now elements is sorted

要按排序顺序获取值:

elements.Sort(
    delegate(element x, element y) {
        return x.priority.CompareTo(y.priority);
    }
);

.NET 2.0中没有LINQ等价物,但您可以编写自己的:

var orderedElements = elements.OrderBy(x => x.priority);
// elements remains the same, but orderedElements will retrieve them in order

用法:

public static IEnumerable<T> OrderBy<T>(IEnumerable<T> source, Comparison<T> comparison) {
    List<T> copy = new List<T>(source);
    copy.Sort(comparison);

    foreach (T item in copy)
        yield return item;
}

答案 4 :(得分:1)

如果要在不创建新实例的情况下对列表本身进行排序,则可以实现 IComparer,然后使用您的实现实例调用List.Sort

public class ElementComparer : IComparer<element>
{
    public int Compare(element x, element y)
    {
        throw new NotImplementedException();
    }
}