var arr = new[] { "+2", "+1", "▲59", "▲77", "▲58", "3", "2", "10", "" };
现有这样一数组, 想要排序成{1,2,3,+1,+2,+3,▲1,▲2,▲3,"",""},其中▲符号可能是其他字符;
我想了一个笨办法,就是分别把这4种类型,分别提出进行排序,然后按顺序排列成一数组。
想问问各位有没更好的办法
需要自定义排序方法,然后先判断首位,如果不一致,直接排出先后,如果一致,再调用默认排序。大体上跟你使用的方式差不多。
现在弄出来大概是
Main{
var numArr = {3,2,1};
var numPlus = {+3,+2,+1};
var numOther = {L1,L3,L2};
List.AddRange(Sort(numArr));
List.AddRange(Sort(numPlus));
List.AddRange(Sort(numOther));
}
如果写成一个方法,应该写个判断在递归里面按照先后顺序执行?
再一个就是sort用的是插入法,而实际数数据里差不多过W,这里效率考量会怎么样?
static List<string> Sort(string[] list) { for (int i = 1; i < list.Length; ++i) { var curStr = list[i]; int t = 0; var charS = string.Empty; int result; if (int.TryParse(curStr, out result) && !curStr.Contains("+")) t = result; else if ((curStr.Contains("+") || curStr.Contains("加")) || (!string.IsNullOrEmpty(curStr) && !int.TryParse(curStr, out result) && !(curStr.Contains("+") || curStr.Contains("加")))) { t = int.Parse(curStr.Substring(1, curStr.Length - 1)); charS = curStr[0].ToString(); } var j = i; while ((j > 0)) { var preStr = list[j - 1]; if ((preStr.Contains("+") || preStr.Contains("加")) || (!string.IsNullOrEmpty(preStr) && !int.TryParse(preStr, out result) && !(preStr.Contains("+") || preStr.Contains("加")))) { var preNum = int.Parse(preStr.Substring(1, preStr.Length - 1)); if (t < preNum) list[j] = string.Format("{0}{1}", preStr[0], preNum); else { break; } } else if (int.Parse(preStr) > t) { list[j] = preStr; } else break; --j; } list[j] = string.Format("{0}{1}", charS, t); } return list.ToList(); }
@阳.咩咩:
private static void Main(string[] args) { var arr = new[] { "+2", "+1", "▲59", "▲77", "▲58", "3", "2", "10", "" }; Array.Sort(arr, (s, s1) => { var sValue = GetStringValue(s); var s1Value = GetStringValue(s1); if (sValue != s1Value) { return sValue - s1Value; } return String.CompareOrdinal(s, s1); }); for (int i = 0; i < arr.Length; i++) { Console.WriteLine(arr[i]); } Console.ReadKey(); } private static int GetStringValue(string s) { int result = 1; if (string.IsNullOrEmpty(s)) { result = 4; } else if (s.Substring(0, 1) == "▲") { result = 3; } else if (s.Substring(0, 1) == "+") { result = 2; } return result; }
我也写了一段代码,你可以看看。
@幻天芒: 非常感谢,代码看起精简多了,也非常直观。
但是10,和2,3比较char有点问题
@幻天芒:
Array.Sort(lstStr, (s, s1) => { var sValue = GetStringValue(s); var s1Value = GetStringValue(s1); if (sValue != s1Value) { return sValue - s1Value; } //改为数字另行判断 int o,o1; if (int.TryParse(s, out o) && int.TryParse(s1, out o1)) return o > o1 ? 1 : -1; return string.CompareOrdinal(s, s1); });
@阳.咩咩: 数字类的判断,如果是字符串类型的话,是默认比较ASCII码的,如果要想"2" < "11",那么就可以转换为数字然后再比较。
你直接写一个arr的排序方法,没必要去都取出来,可是1,2,3,+1,+2,+3,▲1,▲2,▲3你是什么规则排序该好好考虑下,如:string.Empty这类型的扩展方法
排序规则就是:数字,'+',其他符号,empty