2017-07-25 64 views
-2

我有一個IEnumerable<string>與像值:排序的IEnumerable <string>

  • PP
  • pp.10.0
  • pp.6.0
  • pp.6.1
  • pp.8.3
  • kp.10.1
  • kp
  • kp.3.20

...等

我想按字母順序組織它們,但保持與兩位數的值(例如在以上那些與10.0和10.1)以下,個位數的那些。換句話說,整理後應該是這樣的:

  • KP
  • kp.3.20
  • kp.10.1
  • PP
  • pp.6.0
  • pp.6.1
  • pp.8.3
  • pp.10.0

我嘗試了一個簡單的IEnumerable<string>.OrderBy(x => x, StringComparer.CurrentCultureIgnoreCase),但是在這種情況下這不起作用。

還要記住的是,ppkp可能在他們點爲好,如果你想分裂字符串。

+1

我的確在考慮拆分字符串,所以應該如此。如果這些部分也有點,提供更多示例。一般的想法是,你想通過一些'new {key1 = ...,key2 = ...,value = s}'類型進行排序,該類型提供了一個複合關鍵字,它*具有簡單的詞典排序。 –

+1

「另外請記住,如果您正在考慮拆分字符串,那麼pp和kp部分也可能具有點。」在這種情況下應該如何排序?我不清楚。 –

+1

你想要「自然順序」,如在https://stackoverflow.com/questions/248603/natural-sort-order-in-c-sharp –

回答

4

剛剛創建自己的比較器,並把它傳遞給這個超載OrderByhttps://msdn.microsoft.com/de-de/library/bb549422(v=vs.110).aspx

例如:

IEnumerable<string>.OrderBy(x => x, new MyComparer()); 

你自己的比較器可以是一個類(在上面的例子中我把它命名爲MyComparer)實現接口System.Collections.Generic.IComparer<string>。將您的比較邏輯放入方法Compare

class MyComparer : IComparer<string> 
{ 
    public int Compare(string x, string y) 
    { 
     // your logic here 
    } 
} 

// ... 

IEnumerable<string> myListOfStrings = ...; 

myListOfStrings.OrderBy(x => x, new MyComparer()); 
+0

當然,但是* IComparer看起來像什麼?我的意思是,你用什麼邏輯來評估這個特定的案例?我知道'IComparers',只是在處理這個特殊情況。 – cogumel0

+0

這取決於。如果模式是固定的(只有那些你提到的),你可以使用正則表達式來提取組(字母在開頭,值如果存在)。然後你從左到右比較這些組。對於值,您可以將組字符串轉換爲整數,並將它們與實際順序進行比較。但我猜想有很多方法可以做到這一點。只是有創意。 ;) –

+0

我的觀點是,讓我看看一些工作代碼,並將其標記爲正確。事實上,你的回答並沒有給我任何在我的特定情況下起作用的東西 - 即使它有可能指向正確的方向。 – cogumel0

相關問題