1

私は既存の質問を探してみましたが、これをどのように表現するかわからず、これはどこにも結果を取得しませんでした:(

とにかく、私は異なるプロパティを持つ「注文アイテム」のクラスを持っています。こちらのオーダーアイテムは衣料品ですので、サイズ(紐)になります。

私はこの種のことについてOCDなので、要素を英数字値としてのサイズではなく、カスタムオーダーのサイズでソートしてもらいたいと思います。

また、可能であれば、このカスタムオーダーをハードコーディングしないようにします。

内訳として、これらの注文アイテムのリストがあり、それぞれにサイズが含まれている場合は、次のようになります。

2XL
S
5XL
M

英数字の並べ替えでは、次の順序になります。

2XL
5XL
M
S

しかし、私はこのリストをこの順序(最小サイズから最大サイズへ)にソートしたいと思います:

S
M
2XL
5XL

これを行うために考えられる唯一の方法は、サイズのハードコードされた配列を用意し、それらのインデックスで並べ替えることです。次に、サイズ値を取得する必要がある場合は、サイズ順序array[i]値を取得できます。しかし、私が言ったように、私はこの順序がハードコーディングされないことを望みます。

注文を動的にしたい理由は、注文アイテムが実行時にハードディスク上のファイルからロードされ、実行時にユーザーによって追加/編集/削除され、それらに私が持っていないサイズが含まれている可能性があるためです。ハードコーディングされています。たとえば、10XSから10XLまでハードコーディングできますが、誰かが「110cm」(別名ミディアム)のサイズを追加すると、望まない順序でどこかに表示されます。プログラムがクラッシュして燃えないことを前提としています。

これを行う方法に頭を悩ませることはできません。

4

7 に答える 7

5

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

sizes.OrderByDescending(s => s == "S")
     .ThenByDescending( s => s == "M")
     .ThenByDescending( s => s == "2XL")
     .ThenByDescending( s => s == "5XL")
     .ThenBy(s => s);

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

于 2013-03-05T13:10:59.213 に答える
5

また、以下のように を作成しDictionary<int, string>て追加するKey こと Ordering orderもできます。将来の新しいサイズに対応するために、キー間にいくつかのギャップを残します。例: を追加する場合、現在の順序を崩さずL (Large)に新しいアイテムを追加できます。{15, "L"}

 Dictionary<int, string> mySizes = new Dictionary<int, string> { 
                                       { 20, "2XL" }, { 1, "S" },
                                       { 30, "5XL" }, { 10, "M" }
                                    };

 var sizes = mySizes.OrderBy(s => s.Key)
                    .Select(s => new {Size =  s.Value})
                    .ToList();
于 2013-03-05T13:23:15.873 に答える
3

IComparer<string>私はあなた自身に実装しますTShirtSizeComparer。必要な値を取得するには、いくつかの正規表現を実行する必要がある場合があります。

IComparer<T>は、あらゆるソート メカニズムに最適なインターフェイスです。.NET フレームワークの多くの組み込み機能で使用されています。これにより、並べ替えが再利用可能になります。

サイズ文字列を解析して、サイズ番号とサイズ size を持つ別のオブジェクトにしてから、それでソートすることをお勧めします。

于 2013-03-05T13:10:34.160 に答える
1

IComparerクラスにインターフェイスを実装する必要があります。多くの例があるので、その方法をグーグルで検索できます

于 2013-03-05T13:10:05.473 に答える
0

サイズからクラスを作成します。将来、これにさらに機能を追加する必要がある可能性があります。サイズの完全な名前を追加しましたが、幅や長さなどの変数、およびインチまたは cm のコンバーターを追加することもできます。

private void LoadSizes()
{
    List<Size> sizes = new List<Size>();
    sizes.Add(new Size("2X-Large", "2XL", 3));
    sizes.Add(new Size("Small", "S", 1));
    sizes.Add(new Size("5X-Large", "5XL", 4));
    sizes.Add(new Size("Medium", "M", 2));

    List<string> sizesShortNameOrder = sizes.OrderBy(s => s.Order).Select(s => s.ShortName).ToList();
    //If you want to use the size class:
    //List<Size> sizesOrder = sizes.OrderBy(s => s.Order).ToList();
}

public class Size
{
    private string _name;
    private string _shortName;
    private int _order;

    public string Name
    {
        get { return _name; }
    }

    public string ShortName
    {
        get { return _shortName; }
    }

    public int Order
    {
        get { return _order; }
    }

    public Size(string name, string shortName, int order)
    {
        _name = name;
        _shortName = shortName;
        _order = order;
    }
}
于 2013-03-05T14:31:30.670 に答える
0

これには単純なパーサーを作成する必要があります。文字列内で XS XL や cm" などの要素を検索して、それを除外すると、単位が得られます。その後、値である整数を取得できます。それがある場合は、実際に IComparer オブジェクトを使用できますが、そうではありません。そんなにメリットないです。

于 2013-03-05T13:23:23.297 に答える