基于值C#对SortedList排序

时间:2013-03-21 15:07:26

标签: winforms c#-4.0 sortedlist

我有一个排序列表

private SortedList _slSorted = new SortedList(); 

_slSorted的值为Field,类型为class(实际上有2个类交替转储到其中),其中包含所有属性。

例如:

  

key:0 value:class1 object(having properties property 1 , property 2)

     

key:1 value:class2 object(having properties property 3 , property 4)

     

key:2 value:class1 object(having properties property 1 , property 2)

     

依旧......

我需要根据属性1或属性3对sortedList进行排序。

类似收集所有属性值并对它们进行排序并重新排列

我该怎么做?

1 个答案:

答案 0 :(得分:1)

您可以通过编写实现IComparer<object>的类并将其传递给LINQ OrderBy方法来创建已排序的新列表。像这样:

SortedList theList = new SortedList();
// I assume you populate it here
// Then, to sort:
var sortedByValue = theList.Cast<object>().OrderBy(a => a, new ListComparer()).ToList();

这会对项目进行排序并创建一个名为List<object>的新sortedByValueListComparer如下所示。

虽然这回答了你的问题,但我怀疑这是你真正想要的。但是我对你的应用程序,你如何使用SortedList,以及你想对上面的结果做什么都不了解,以提供任何不同的建议。我强烈怀疑你需要重新思考你的设计,因为你在这里所做的事情是相当不寻常的。

这是ListComparer

public class ListComparer: IComparer<object>
{
    public int Compare(object x, object y)
    {
        if (x == null && y == null)
        {
            return 0;
        }
        if (x == null)
        {
            return -1;
        }
        if (y == null)
        {
            return 1;
        }
        if (x is Class1)
        {
            if (y is Class1)
            {
                return (x as Class1).Prop1.CompareTo((y as Class1).Prop1);
            }
            // Assume that all Class1 sort before Class2
            return 1;
        }
        if (x is Class2)
        {
            if (y is Class2)
            {
                return (x as Class2).Prop3.CompareTo((y as Class2).Prop3);
            }
            if (y is Class1)
            {
                // Class1 sorts before Class2
                return -1;
            }
            // y is not Class1 or Class2. So sort it last.
            return 1;
        }
        // x is neither Class1 nor Class2 
        if ((y is Class1) || (y is Class2))
        {
            return -1;
        }
        // Don't know how to compare anything but Class1 and Class2
        return 0;
    }
}