列表的排序包含具有字母/数字的字符串

我想制作字符串的排序列表,其中包含按字母顺序排列的字符串,混合字母和数字以及仅限数字。我的客户要求排序如下:

tablelist类型对象中的排序包含项目代码:111,111A,222,411G,300,411Z,G411,AG500,A111,AZ600,ABQ,ZZZ,AAN等

要求结果:首先显示数字(如111然后222然后300等…)接下来将是带有字母的数字(如111A然后411G然后411Z等…)下一个带数字的字母(如A111然后是G411然后是AG500然后是AZ600等….)只有下一个字母(比如AAN然后是ABQ然后是ZZZ等……)

所以字符串可以是任何东西。但我想得到排序作为必需的结果。 所以请帮我解决一下。

unsortedStringList.Sort(new AlphanumComparatorFastString()); 

AlphanumComparator:

  public class AlphanumComparatorFastString : IComparer { public int Compare(string s1, string s2) { if (s1 == null) return 0; if (s2 == null) return 0; int len1 = s1.Length; int len2 = s2.Length; int marker1 = 0; int marker2 = 0; // Walk through two the strings with two markers. while (marker1 < len1 && marker2 < len2) { char ch1 = s1[marker1]; char ch2 = s2[marker2]; // Some buffers we can build up characters in for each chunk. char[] space1 = new char[len1]; int loc1 = 0; char[] space2 = new char[len2]; int loc2 = 0; // Walk through all following characters that are digits or // characters in BOTH strings starting at the appropriate marker. // Collect char arrays. do { space1[loc1++] = ch1; marker1++; if (marker1 < len1) { ch1 = s1[marker1]; } else { break; } } while (char.IsDigit(ch1) == char.IsDigit(space1[0])); do { space2[loc2++] = ch2; marker2++; if (marker2 < len2) { ch2 = s2[marker2]; } else { break; } } while (char.IsDigit(ch2) == char.IsDigit(space2[0])); // If we have collected numbers, compare them numerically. // Otherwise, if we have strings, compare them alphabetically. string str1 = new string(space1); string str2 = new string(space2); int result; if (char.IsDigit(space1[0]) && char.IsDigit(space2[0])) { int thisNumericChunk = int.Parse(str1); int thatNumericChunk = int.Parse(str2); result = thisNumericChunk.CompareTo(thatNumericChunk); } else { result = str1.CompareTo(str2); } if (result != 0) { return result; } } return len1 - len2; } } 

见http://www.dotnetperls.com/alphanumeric-sorting

试试这个:

 var text = "111,111A,222,411G,300,411Z,G411,AG500,A111,AZ600,ABQ,ZZZ,AAN"; var list = text.Split(',').ToList(); var result = list.OrderBy(i => i, new StringCompare()); foreach (var item in result) { Console.WriteLine(item); } 

StringCompare类:

 class StringCompare : IComparer { string[] exps = new[] { @"^\d+$", @"^\d+[a-zA-Z]+$", @"^[a-zA-Z]\d+$", @"^[a-zA-Z]+\d+$" }; public int Compare(string x, string y) { for (int i = 0; i < exps.Length; i++) { var isNumberx = Regex.IsMatch(x, exps[i]); var isNumbery = Regex.IsMatch(y, exps[i]); if (isNumberx && isNumbery) return string.Compare(x, y); else if (isNumberx) return -1; else if (isNumbery) return 1; //return string.Compare(x, y); } return string.Compare(x, y); } } 

你会得到:

 111 222 300 111A 411G 411Z A111 G411 AG500 AZ600 AAN ABQ ZZZ