سؤال

I have a sorted list

private SortedList _slSorted = new SortedList(); 

_slSorted has value Field which is of type class (actually 2 classes alternately dumped into them) having all the properties in them.

For example:

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)

and so on..

I need to sort the sortedList based on either property 1 or property 3.

something like collect all the property values and sort them and rearrange

How can I do that?

هل كانت مفيدة؟

المحلول

You can create a new list that is sorted, by writing a class that implements IComparer<object>, and passing that to the LINQ OrderBy method. Like this:

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

That will sort the items and create a new List<object> called sortedByValue. The ListComparer is shown below.

Whereas this answers your question, I doubt that it's what you really want. But I don't know enough about your application, how you're using the SortedList, and what you want to do with the result above to give any kind of suggestion for doing it differently. I strongly suspect that you need to re-think your design, because what you're doing here is rather unusual.

Here's the 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;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top