2017-02-22 6 views
1

一般的な改訂履歴シーケンスで使用されているシーケンスに関連した順序で文字列のリストをソートしようとしています。一部の顧客は「 - 」または「新規」などの特定のコードで始まり、LINQを使用してカスタムソート順を定義できます。ただし、Rev AからRev Zまで図面が改訂された後はRev AAからRev AZ、次にRev BAからBZなどになります。 LINQを使用して次のリストを並べ替えるにはどうすればよいですか?linqをカスタムソートで使用して文字列のリストを並べ替える

Iはコードの例示的なブロックとしてこれを持っている:

List<string> revList = new List<string> { "A", "NC", "New", "AB", "PD", "PD1", 
              "PD2", "B", "-", "*", "BB", "NA" }; 
revList = revList.OrderByDescending(i => i.ToLower() == "pd"). 
        ThenByDescending(i => i.ToLower() == "nc"). 
        ThenByDescending(i => i.ToLower() == "na"). 
        ThenByDescending(i => i.ToLower() == "new"). 
        ThenByDescending(i => i.ToLower() == "pd1"). 
        ThenByDescending(i => i.ToLower() == "pd2"). 
        ThenByDescending(i => i.ToLower() == "-"). 
        ThenByDescending(i => i.ToLower() == "*"). 
        ThenBy(i => i).ToList(); 

foreach (string rev in revList) 
    Console.WriteLine(rev); 

これは、出力を生成する:

PD 
NC 
NA 
NEW 
PD1 
PD2 
- 
* 
A 
AB 
B 
B 

Iを生成したい:

PD 
NC 
NA 
NEW 
PD1 
PD2 
- 
* 
A 
B 
AB 
BB 
+2

最初に「長さ」で並べ替えます。 'ThenBy(i => i)'の前に 'ThenBy(i => i.Length).'を挿入してください。 –

+1

Ivan、勝ちます。私はそれが最初だったのであなたの答えに投票することができたらいいのに、それはコメントだった。ありがとうございました。 – AuLion

+0

なぜ「PD」は「NC」が望ましい結果になる前に来たのですか? –

答えて

2

このコードはのために働い私。

var revList = new List<string> { "A", "NC", "New", "AB", "PD", "PD1", 
             "PD2", "B", "-", "*", "BB", "NA" }; 

     revList = revList.OrderByDescending(i => i.ToLower() == "pd"). 
          ThenByDescending(i => i.ToLower() == "nc"). 
          ThenByDescending(i => i.ToLower() == "na"). 
          ThenByDescending(i => i.ToLower() == "new"). 
          ThenByDescending(i => i.ToLower() == "pd1"). 
          ThenByDescending(i => i.ToLower() == "pd2"). 
          ThenByDescending(i => i.ToLower() == "-"). 
          ThenByDescending(i => i.ToLower() == "*"). 
          ThenBy(i => i.Length).ToList(); 

     foreach (string rev in revList) 
      Console.WriteLine(rev); 
     Console.ReadLine(); 
+0

ありがとう、Sameer!私はそれについて考えなかったと信じていません。 – AuLion

0

あなたはこのようにカスタムオブジェクトを作成することができます。

class Revision 
{ 
    public string Name { get; set; } 
    public int Rank { get; set; } 

    public Revision(string Name, int Rank) 
    { 
     this.Name = Name; 
     this.Rank = Rank; 
    } 
} 

は、その後、あなたは、これらのオブジェクトのリストを作成することができます。

ような何か:今

List<Revision> revisions = new List<Revision>(); 
revision.Add(new Revision("PD",1)); 
revision.Add(new Revision("NC",2)); 

あなたはLINQを使用しての代わりに、名前を解析しようランクで並べ替えることができます。

ZZに行く必要があるかもしれないので、最初にオブジェクトを設定するのは苦痛かもしれませんが、これでオーダーを完全に制御できます。

P.S. - 私はこのコードをテストしなかった。

関連する問題