public int CompareTo(VersionEx value) { if (value == null) { throw new ArgumentNullException(nameof(value)); } if (Major != value.Major) { if (Major > value.Major) { return(1); } else { return(-1); } } if (Minor != value.Minor) { if (Minor > value.Minor) { return(1); } else { return(-1); } } if (Build != value.Build) { if (Build > value.Build) { return(1); } else { return(-1); } } if (Revision != value.Revision) { if (Revision > value.Revision) { return(1); } else { return(-1); } } return(0); }
/// <summary> /// Compare string, which would be number /// </summary> public static CompareStringNumberResult CompareStringNumber(string str1, string str2, bool ignoreCase = true) { // Try version number compare VersionEx v1 = VersionEx.Parse(str1); VersionEx v2 = VersionEx.Parse(str2); if (v1 != null && v2 != null) { int comp = v1.CompareTo(v2); if (comp < 0) { return(CompareStringNumberResult.Smaller); } else if (comp == 0) { return(CompareStringNumberResult.Equal); } else { return(CompareStringNumberResult.Bigger); } } // Do simple number or string compare ParseStringToNumberType type1 = ParseStringToNumber(str1, out long z1, out decimal r1); ParseStringToNumberType type2 = ParseStringToNumber(str2, out long z2, out decimal r2); if (type1 == ParseStringToNumberType.Integer && type2 == ParseStringToNumberType.Integer) { // Args are both int long comp = z1 - z2; if (comp < 0) { return(CompareStringNumberResult.Smaller); } else if (comp == 0) { return(CompareStringNumberResult.Equal); } else { return(CompareStringNumberResult.Bigger); } } if (type1 == ParseStringToNumberType.Integer && type2 == ParseStringToNumberType.Decimal || type1 == ParseStringToNumberType.Decimal && type2 == ParseStringToNumberType.Integer || type1 == ParseStringToNumberType.Decimal && type2 == ParseStringToNumberType.Decimal) { // One arg is decimal decimal comp = r1 - r2; if (comp < 0) { return(CompareStringNumberResult.Smaller); } else if (comp == 0) { return(CompareStringNumberResult.Equal); } else { return(CompareStringNumberResult.Bigger); } } // if (type1 == ParseStringToNumberType.String || type2 == ParseStringToNumberType.String) // One of arg is string, so just compare StringComparison compOpt = StringComparison.Ordinal; if (ignoreCase) { compOpt = StringComparison.OrdinalIgnoreCase; } if (str1.Equals(str2, compOpt)) { return(CompareStringNumberResult.Equal); } else { return(CompareStringNumberResult.NotEqual); } }