2011-07-31 171 views
1

我有列表。該列表僅保存整數值,但數據類型爲字符串。我想根據項目的整數順序對列表進行排序。字符串列表基於整數的順序排序

我該如何實現它?

List<string> newZipCodesList = new List<string>(); 
+0

如果它包含整數,爲什麼不使用'List '? –

+0

我從另一種方法得到它。我無法改變它。 – Lijo

+0

缺省的字符串排序也可以正常工作,而不必將每個字符串轉換爲int和後面的開銷。它效率更高,代碼更少。 – user807566

回答

2

您可以使用IComparer接口來實現自己的排序。你將不得不創建一個類來實現T的IComparer,其中T在這種情況下將是字符串。

newZipCodesList.Sort(new Test()); 

    public class Test : IComparer<string> 
    { 
     public int Compare(string x, string y) 
     { 
      //return 1 when first is greater than second 
      if(Convert.ToInt32(x) > Convert.ToInt32(y)) 
       return 1; 
      //return -1 when first is less than second 
      else if (Convert.ToInt32(x) < Convert.ToInt32(y)) 
       return -1; 
      //return 0 if they are equal 
      else 
       return 0; 
     } 
    } 
+1

@Haris你可以通過用一行代替'Compare'方法內部的主體來改善它'return Convert.ToInt32(x) - Convert.ToInt32(Y );';) –

+0

@Jalal:這段代碼並不是關於性能,而是關於以最簡單的形式教給別人什麼東西 –

+0

@Jalal在zipcode的情況下,這種改變將起作用,但在一般情況下,並非如此,與非常小的值相比,非常大的值會以某種方式產生溢出。 –

0
newZipCodesList.Sort((a,b) => { 
          int a1; 
          int a2; 
          if !(int.TryParse(a,out a1)) return 1; 
          if !(int.TryParse(b,out b1)) return -1; 
          return a1.CompareTo(b1); 

} 
2

這是如果你需要整數訂購。

List<string> sortedZipCodes = (from code in newZipCodesList 
           orderby Convert.ToInt32(code) 
           select code).ToList(); 
0

如果字符串都是數字,則可以使用其他答案。如果情況並非如此,那麼看看更復雜的排序here

2

我不知道你爲什麼首先使用List<string>,但不管怎樣,你可以將列表複製到int列表中,對其進行排序然後將其複製回字符串,或者通過將每個比較器強制轉換爲int來排序字符串比較一下,也可以使用API​​來NUMERICS值的字符串進行排序,但在這裏你可以使用它的唯一數字:

[DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)] 
private static extern int StrCmpLogicalW(String x, String y); 

這樣:

newZipCodesList.Sort(StrCmpLogicalW); 

//測試:

List<string> list = new List<string>(new string[] { "1", "4", "17", "5", "112", "0" }); 

list.Sort(StrCmpLogicalW); 

//results: 0, 1, 4, 5, 17, 112 
+0

你能解釋爲什麼DllImport(「shlwapi.dll」?我認爲從「哈里斯哈桑」的作品有效。任何不同的想法? – Lijo

+0

'你能解釋爲什麼DllImport(「shlwapi.dll」?我想從「哈里斯哈桑「作品」@Lijo使用@哈里斯的答案,在你的情況下更簡單,我沒有添加這個答案作爲他的替代品,因爲我在他之前發佈了我的答案,還要注意我們在這裏提供替代品。 –

+0

當然,我很欣賞論壇和你的答案。我只是仔細檢查是否有任何差異。 – Lijo

2

如果它是安全的假設,列表中的所有元素是相同的長度(例如郵政編碼通常是5個字符),則沒有必要進行排序之前調用Int.Parse()Convert.ToInt()上每一個項目。即使它們被表示爲字符串,「字母」排序仍然應該將它們按數字順序排列,因爲「0」在「1」出現在「2」之前之前出現...並且比執行所有轉換更快。

在這種情況下,這會工作:

List<String> zipCodes = new List<String>(); 
zipCodes.Add("00124"); 
zipCodes.Add("00123"); 
zipCodes.Add("98765"); 
zipCodes.Add("12345"); 
zipCodes.Add("33333"); 
zipCodes.Add("24680"); 

// zipCodes = zipCodes.Select(z => z.PadLeft(5, '0')).ToList(); 
zipCodes.Sort(); 

for(int i = 0; i < zipCodes.Count; i++) 
    Console.WriteLine(zipCodes[i]); 

這裏是輸出:

0
00124 
12345 
24680 
33333 
98765 

如果他們是不一樣的長度,你可以墊他們,視以後如何使用列表。 (請參閱代碼中的註釋行)。 這會將諸如1之類的東西轉換爲00001

+0

默認排序不工作..嘗試使用以下數據 - zipCodes.Add(「1」); zipCodes.Add(「2」); zipCodes.Add(「10」); – Lijo

+1

@Lijo:我沒有意識到你會考慮不同長度的郵政編碼。我的解決方案假設每個字符串都具有相同數量的字符。我對可處理5個或更少字符的任何郵政編碼的代碼進行了更新。不過,這取決於您在應用程序中如何使用列表。 – user807566

+1

@Lijo,如果您的郵政編碼值爲「1」,我鼓勵您查找系統濫用郵政編碼的位置。不要將複雜的算法複雜化到其他地方,糾正錯誤。一個結構合理的郵政編碼決不應該是「1」。我的猜測是,在某個地方,該計劃將其視爲一個數字。儘管由數字組成,但郵政編碼從不是數字類型,不應該像一個一樣處理。 –