我有列表。該列表僅保存整數值,但數據類型爲字符串。我想根據項目的整數順序對列表進行排序。字符串列表基於整數的順序排序
我該如何實現它?
List<string> newZipCodesList = new List<string>();
我有列表。該列表僅保存整數值,但數據類型爲字符串。我想根據項目的整數順序對列表進行排序。字符串列表基於整數的順序排序
我該如何實現它?
List<string> newZipCodesList = new List<string>();
您可以使用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;
}
}
@Haris你可以通過用一行代替'Compare'方法內部的主體來改善它'return Convert.ToInt32(x) - Convert.ToInt32(Y );';) –
@Jalal:這段代碼並不是關於性能,而是關於以最簡單的形式教給別人什麼東西 –
@Jalal在zipcode的情況下,這種改變將起作用,但在一般情況下,並非如此,與非常小的值相比,非常大的值會以某種方式產生溢出。 –
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);
}
這是如果你需要整數訂購。
List<string> sortedZipCodes = (from code in newZipCodesList
orderby Convert.ToInt32(code)
select code).ToList();
如果字符串都是數字,則可以使用其他答案。如果情況並非如此,那麼看看更復雜的排序here。
我不知道你爲什麼首先使用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
如果它是安全的假設,列表中的所有元素是相同的長度(例如郵政編碼通常是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
默認排序不工作..嘗試使用以下數據 - zipCodes.Add(「1」); zipCodes.Add(「2」); zipCodes.Add(「10」); – Lijo
@Lijo:我沒有意識到你會考慮不同長度的郵政編碼。我的解決方案假設每個字符串都具有相同數量的字符。我對可處理5個或更少字符的任何郵政編碼的代碼進行了更新。不過,這取決於您在應用程序中如何使用列表。 – user807566
@Lijo,如果您的郵政編碼值爲「1」,我鼓勵您查找系統濫用郵政編碼的位置。不要將複雜的算法複雜化到其他地方,糾正錯誤。一個結構合理的郵政編碼決不應該是「1」。我的猜測是,在某個地方,該計劃將其視爲一個數字。儘管由數字組成,但郵政編碼從不是數字類型,不應該像一個一樣處理。 –
如果它包含整數,爲什麼不使用'List'? –
我從另一種方法得到它。我無法改變它。 – Lijo
缺省的字符串排序也可以正常工作,而不必將每個字符串轉換爲int和後面的開銷。它效率更高,代碼更少。 – user807566