MCUtils.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using System.Globalization;
  2. namespace PCLCS;
  3. public static class McUtils {
  4. /// <summary>
  5. /// 比较两个版本名;左侧较新返回正数,相同返回 0,右侧较新返回负数。
  6. /// 无法比较两个预发布版的大小。
  7. /// 支持的格式:未知版本, 26.1-snapshot-1,1.13.2, 1.7.10-pre4, 1.8_pre, 1.14 Pre-Release 2, 1.14.4 C6
  8. /// </summary>
  9. public static int CompareVersion(string left, string right) {
  10. if (left == right) return 0;
  11. if (left == "未知版本" || right == "未知版本") return left == "未知版本" ? 1 : -1;
  12. left = left.Lower();
  13. right = right.Lower();
  14. var leftParts = left.Replace("快照", "snapshot").Replace("预览版", "pre").RegexSearch("[a-z]+|[0-9]+").ToList();
  15. var rightParts = right.Replace("快照", "snapshot").Replace("预览版", "pre").RegexSearch("[a-z]+|[0-9]+").ToList();
  16. for (int i = 0; ; i++) {
  17. if (i >= leftParts.Count && i >= rightParts.Count) return string.Compare(left, right, StringComparison.Ordinal); // 两边均缺失,感觉是一个东西
  18. string leftValue = i < leftParts.Count ? leftParts[i] : "0";
  19. string rightValue = i < rightParts.Count ? rightParts[i] : "0";
  20. if (leftValue == rightValue) continue;
  21. int leftNumber = leftValue switch {
  22. "rc" => -1,
  23. "pre" => -2,
  24. "snapshot" => -3,
  25. "experimental" => -4,
  26. _ => int.TryParse(leftValue, NumberStyles.Integer, CultureInfo.InvariantCulture, out int leftResult) ? leftResult : 0
  27. };
  28. int rightNumber = rightValue switch {
  29. "rc" => -1,
  30. "pre" => -2,
  31. "snapshot" => -3,
  32. "experimental" => -4,
  33. _ => int.TryParse(rightValue, NumberStyles.Integer, CultureInfo.InvariantCulture, out int rightResult) ? rightResult : 0
  34. };
  35. if (leftNumber == 0 && rightNumber == 0) return string.Compare(leftValue, rightValue, StringComparison.Ordinal);
  36. if (leftNumber != rightNumber) return leftNumber.CompareTo(rightNumber);
  37. }
  38. }
  39. /// <summary>
  40. /// 比较两个版本名;左侧不旧于右侧返回 True。
  41. /// </summary>
  42. public static bool CompareVersionGE(string left, string right) => CompareVersion(left, right) >= 0;
  43. }