2

誰かがこのクエリを解決するのを手伝ってくれませんか.,,

ステータス列に基づいてソートする必要があるリストがあります。サンプルリスト。

IList<Letters> lstLetterSummary = new List<Letters>();

レターデータ契約

public class ERDRMessageSummary
{
    [DataMember(IsRequired = true, Order = 1)]
    public string LetterId{ get; set; }

    [DataMember(IsRequired = true, Order = 2)]
    public int MessageId { get; set; }

    [DataMember(IsRequired = true, Order = 3)]
    public string MessageType { get; set; }

    [DataMember(IsRequired = true, Order = 4)]
    public DateTime RegisteredDate { get; set; }

    [DataMember(IsRequired = true, Order = 5)]
    public string Status { get; set; }

    [DataMember(IsRequired = true, Order = 7)]
    public string FirstName { get; set; }

    [DataMember(IsRequired = true, Order = 8)]
    public string LastName { get; set; }

     }

コントラクトで確認できるように、リストには status というメンバーが含まれています。値は次のとおりです。1.Registered。2.送信待ち。3.送信しました。4.却下。

リストはステータス値に基づいてソートする必要があり、以下の順序にする必要があります。1.却下。2.送信待ち。3.送信しました。4.登録しました。

これにはc#とlinqを使用しています..

どんな助けでも大歓迎です..

4

3 に答える 3

3

これはどうですか?

string[] statuses = { "Rejected", "Waiting", "To send", "Sent", "Registered" }; 
Dictionary<string, int> OrderingDictionary =
  statuses
  .Select((x, i) => new { x, i })
  .ToDictionary(z => z.x, z => z.i);

List<string> orderedData =
  lstLetterSummary
  .OrderBy(s => OrderingDictionary[s])
  .ToList();
于 2013-09-18T18:53:03.243 に答える
3

これはどう?とてもシンプルです:)

string[] statuses = { "Rejected", "Waiting to send", "Sent", "Registered" };
lstLetterSummary.Sort((x, y) =>
{
     return Array.IndexOf(statuses, x.Status).CompareTo(Array.IndexOf(statuses, y.Status));
});
于 2013-09-18T19:06:00.717 に答える
2

最初に、ステータス文字列を目的の順序に対応する数値に変換するメソッドを定義します。

int GetStatusOrder(string status)
{
    switch (status)
    {
        case "Rejected"        : return 1;
        case "Waiting to sent" : return 2;
        case "Sent"            : return 3;
        case "Registered"      : return 4;
        default                : return 5;
    }
}

次に、LINQOrderBy演算子を使用して、このメソッドを呼び出すことができます。

var sortedList = myList.OrderBy(l => GetStatusOrder(l.Status)).ToList();

これは、クラスを変更できない場合の簡単な解決策です。可能であれば、Statusフィールドの型を文字列から列挙型に変換する必要があります。

于 2013-09-18T18:54:17.880 に答える