我正在尝试对一组数字进行排序,这些数字是字符串,我希望它们能够按数字排序。
问题是 我无法将数字转换为int 。
这是代码:
string[] things= new string[] { "105", "101", "102", "103", "90" }; foreach (var thing in things.OrderBy(x => x)) { Console.WriteLine(thing); }
输出:101、102、103、105、90
我想要:90、101、102、103、105
编辑:输出不能为090、101、102 …
更新了代码示例,使其说“东西”而不是“大小”。该数组可以是这样的:
string[] things= new string[] { "paul", "bob", "lauren", "007", "90" };
这意味着它需要按字母顺序和数字排序:
007、90,鲍勃,劳伦,保罗
将自定义比较器传递到OrderBy。Enumerable.OrderBy将让您指定所需的任何比较器。
这是一种方法:
void Main() { string[] things = new string[] { "paul", "bob", "lauren", "007", "90", "101"}; foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer())) { Console.WriteLine(thing); } } public class SemiNumericComparer: IComparer<string> { /// <summary> /// Method to determine if a string is a number /// </summary> /// <param name="value">String to test</param> /// <returns>True if numeric</returns> public static bool IsNumeric(string value) { return int.TryParse(value, out _); } /// <inheritdoc /> public int Compare(string s1, string s2) { const int S1GreaterThanS2 = 1; const int S2GreaterThanS1 = -1; var IsNumeric1 = IsNumeric(s1); var IsNumeric2 = IsNumeric(s2); if (IsNumeric1 && IsNumeric2) { var i1 = Convert.ToInt32(s1); var i2 = Convert.ToInt32(s2); if (i1 > i2) { return S1GreaterThanS2; } if (i1 < i2) { return S2GreaterThanS1; } return 0; } if (IsNumeric1) { return S2GreaterThanS1; } if (IsNumeric2) { return S1GreaterThanS2; } return string.Compare(s1, s2, true, CultureInfo.InvariantCulture); } }