0

私はそのクラスを持っています

public class MyItem
{
    public Order OrderItem { get; set; }
    public string Status { get; set; }
}

プロパティは、、、 のStatus値を持つことができますErrorPendingSuccess

プロパティList<MyItem>()に基づいてオブジェクトを並べ替えたい。Status

Statusプロパティの型を からstringに置き換えてから, ,値をint, ,に置き換えることができることを知っており、並べ替え操作は簡単です。しかし、 type プロパティに基づいて並べ替えを行う必要がある場合は、どうすればよいのでしょうか。ErrorPendingSuccess123string

可能な順序:

ErrorPendingSuccessまたはSuccessPending_Error

LINQ を使用してそれを行う方法は?

4

8 に答える 8

4

Its better to parse to an enum but, you could make a custom comparer,

var customComparer = Comparer<string>.Create((x, y) =>
    {
        ...
    });

You can than pass the the comparer into sort and order by functions, like this,

var sortedList = myList.OrderBy(x => x.Status, customComparer);
于 2013-06-06T10:33:11.697 に答える
3

最も簡単な方法は、おそらくIComparable<T>インターフェースを実装することです。このインターフェイスをMyItemクラスに実装すると、MyItemインスタンスのリストを並べ替えるときに、CompareToメソッドで指定された順序が使用されるようになります。あなたのユースケースでは、これは次のようなコードになります:

public class MyItem : IComparable<MyItem>
{
    public string OrderItem { get; set; }
    public string Status { get; set; }

    public int CompareTo(MyItem other)
    {
        if (other == null)
        {
            return 1;
        }

        if (other.Status == this.Status)
        {
            return 0;
        }

        var statusAsInt = this.Status == "Error" ? 0 : (this.Status == "Pending" ? 1 : 2);
        var otherStatusAsInt = other.Status == "Error" ? 0 : (other.Status == "Pending" ? 1 : 2);

        if (statusAsInt == otherStatusAsInt)
        {
            return 0;
        }

        return statusAsInt < otherStatusAsInt ? -1 : 1;
    }
}

internal class Program
{
    private static void Main(string[] args)
    {
        var myItems = new List<MyItem> { new MyItem { Status = "Pending" }, new MyItem { Status = "Error" }, new MyItem { Status = "Success " } };

        myItems.Sort();

        foreach (var myItem in myItems)
        {
            Console.WriteLine(myItem.Status);
        }    
    }
}
于 2013-06-06T10:32:05.270 に答える
2

必要な順序を反映する辞書を定義できます

Dictionary<string, int> ordering = new Dictionary<string, int> {
  { "Error", 1 },
  { "Pending", 2 },
  ...
}

var sortedList = myList.OrderBy(x => ordering[x.Status]);
于 2013-06-06T10:32:38.267 に答える
1

注文はたまたまアルファベット順なので、簡単に行うことができます

var result = myList.OrderBy(item => item.Status);

また

var result = myList.OrderByDescending(item => item.Status);

ただし、「Success」の名前を「Complete」に変更すると、壊れてしまいます。その場合は、提案されたenum回答のいずれかをお勧めします。

于 2013-06-06T10:32:12.317 に答える
0

私は列挙型オプションを選びますが、それがあなたの好みのオプションではないことを考えると、次のことを試すことができます:

IComparable<MyItem>クラスに実装できますMyItem

そこで、Status プロパティに従って順序付けのロジックを実装します。2 つのステータスが等しい場合でも、必要に応じて OrderItem で注文できます。

例が必要な場合は、遠慮なく言ってください

于 2013-06-06T10:33:41.000 に答える