0

ソートされたリストがあります

private SortedList _slSorted = new SortedList(); 

_slSortedFieldそれらの中にすべてのプロパティを持つタイプクラス(実際には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 に答える