2013-10-09 90 views
2

我有一個對象列表,我想使用Option.Numero_Reference屬性進行排序。c#OrderBy string hierachy xx.xx.xx

的事情是,Numero_reference在xx.xx.xx格式

字符串有沒有辦法通過XX組的順序?

這裏是一個已經做了,現在,巫不工作:

myList.OrderByDescending(x => x.Option.Numero_Reference) 
.ThenByDescending(x => x.Option.Numero_Reference.Substring(x.Option.Numero_Reference.IndexOf("."))) 

此代碼給了我這樣的:

  • 3.9.6
  • 3.9.2
  • 3.8
  • 3.7.2
  • 3.6
  • 3.17.5
  • 3.17
  • 3.16.4.7
  • 3.11
  • 3.10.1

當我應該有:

  • 3.17.5
  • 3.17
  • 3.16.4.7
  • 3.11
  • 3.10.1
  • 3.9.6
  • 3.9.2
  • 3.8
  • 3.7.2
  • 3.6

了我們可以看到,基本的字符串比較在第一點後第10點出錯。

另一件事是,分組的數量是可變的,並且不遵循任何規則。

任何人都可以幫忙嗎?

編輯

這裏是與版本的解決方案完整的查詢:

context.Options.Join(context.Categories_Options, 
opt => opt.ID_Option, 
cat_opt => cat_opt.ID_Option, 
(opt, cat_opt) => new { Option = opt, Categories_Options = cat_opt }) 
.Where(x => x.Categories_Options.ID_Categorie == catId) 
.OrderByDescending(x => new Version(x.Option.Numero_Reference)) 
.Select(x => x.Option) 
.ToList(); 

這只是給我一個空列表。

+0

它給你'空list'因爲'Where'方法,那**犯規'**'涉及Version'的'OrderByDescending'應該沒有任何過濾出來的元素工作確定。 –

回答

8

你可以使用它內置有訂貨的Version類:

myList.OrderByDescending(x => new Version(x.Option.Numero_Reference)) 
2

可以使用Version類來表示這些字符串,並Version比較方法應導致你期望的那種,而不是基於詞典順序。

myList.OrderByDescending(x => new Version(x.Option.Numero_Reference)) 
+1

你很遲纔回答...... 6秒。 +1 – user2711965

0

如果您確定永遠不會有超過四個組件,您可以使用Version類作爲其他答案的建議。如果將有四個以上的組件,您可以執行下列操作之一:

0

我想添加此答案只是爲了另一個參考。如果你的格式與Version號碼格式相符,其他答案是最好的,用我的這個答案,你只需要知道每個地方的最大數字位數(用點分隔)和最大數目所有的數字:

//this can be used for the format from XX to XX.XX.XX.XX.XX.XX 
var result = myList.OrderByDescending(x => 
        string.Join("",x.Option.Numero_Reference.Split('.') 
          .Select(a=>a.PadLeft(2,'0')).ToArray()).PadRight(12,'0')); 
//You can replace the 2 and 12 to the maximum number you want.