11

私はList<string>XS、S、M、L、XL、XXL、UK 10、UK12などのサイズを持っています

私が欲しいのは、リスト内のアイテムの順序に関係なく、上記の順序に強制することです。IComparable演算子が必要だと思いますが、よくわかりません。

理想的には、リスト内の「場所」を参照してそれ自体を再ソートできる正しい順序の別のリストが必要です。存在しない場合は、デフォルトでAZになります。

4

5 に答える 5

21

サイズの配列を希望する順序で作成し、その配列内のサイズの位置でシャツを並べ替えます。

string[] sizes = new [] {"XS", "S", "M", "L", "XL", "XXL", "UK 10", "UK 12"};

var shirtsInOrder = shirts
                        .OrderBy(s=>sizes.Contains(s) ? "0" : "1")  // put unmatched sizes at the end
                        .ThenBy(s=>Array.IndexOf(sizes,s))  // sort matches by size
                        .ThenBy(s=>s); // sort rest A-Z
于 2012-12-11T16:31:19.843 に答える
3
var order = new string[] { "XS", "S", "M", "L", "XL", "XXL", "UK10", "UK12" };

var orderDict = order.Select((c, i) => new { sze = c, ord = i })
            .ToDictionary(o => o.sze, o => o.ord);

var list = new List<string> { "S", "L", "XL", "L", "L", "XS", "XL" };
var result = list.OrderBy(item => orderDict[item]);
于 2012-12-11T16:31:00.913 に答える
2

OrderByDescending+ThenByDescendingを直接使用できます。

sizes.OrderByDescending(s => s == "XS")
     .ThenByDescending( s => s == "S")
     .ThenByDescending( s => s == "M")
     .ThenByDescending( s => s == "L")
     .ThenByDescending( s => s == "XL")
     .ThenByDescending( s => s == "XXL")
     .ThenByDescending( s => s == "UK 10")
     .ThenByDescending( s => s == "UK 12")
     .ThenBy(s => s);

...Descendingatrueは 1 に似ているのに対し、afalseは 0 であるため、使用します。

于 2012-12-11T16:28:58.390 に答える
1

次のようなこともできます。

public class ShirtComparer : IComparer<string>
{
    private static readonly string[] Order = new[] { "XS", "S", "M", "L", "XL", "XXL", "UK10", "UK12" };

    public int Compare(string x, string y)
    {
        var xIndex = Array.IndexOf(Order, x);
        var yIndex = Array.IndexOf(Order, y);

        if (xIndex == -1 || yIndex == -1) 
            return string.Compare(x, y, StringComparison.Ordinal);

        return xIndex - yIndex;
    }
}

使用法:

var list = new List<string> { "S", "L", "XL", "L", "L", "XS", "XL", "XXXL", "XMLS", "XXL", "AM19" };
var result = list.OrderBy(size => size, new ShirtComparer());

また、リストにない値についてはデフォルトで AZ にする必要があります...

于 2012-12-11T16:52:14.953 に答える
0

他のリストを作成し、デリゲートを使用して並べ替えを使用することもできます。ここで、サイズ 1 のインデックス > サイズ 2 のインデックスの場合に戻ります。

于 2012-12-11T16:31:55.363 に答える