0

我有一个排序列表

private SortedList _slSorted = new SortedList(); 

_slSorted具有Field类类型的值(实际上有 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)

等等..

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

诸如收集所有属性值并将它们排序并重新排列

我怎样才能做到这一点?

4

1 回答 1

1

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

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>名为sortedByValue. 如下图ListComparer所示。

尽管这回答了您的问题,但我怀疑这是否是您真正想要的。但我对您的应用程序、您如何使用 以及您想对上面的结果做什么了解不够,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;
    }
}
于 2013-03-22T13:48:42.253 回答