publicclassVersion:IComparable<Version>{publicint[] Parts {get;}publicVersion(stringvalue){if(value==null)thrownewArgumentNullException();if(!Regex.IsMatch(value,@"^[0-9]+(\.[0-9]+)*$"))thrownewArgumentException("Invalid format");var parts =value.Split('.');
Parts =newint[parts.Length];for(var i =0; i < parts.Length; i++)
Parts[i]=int.Parse(parts[i]);}publicoverridestringToString(){returnstring.Join(".", Parts);}publicintCompareTo(Version that){if(that ==null)return1;var thisLength =this.Parts.Length;var thatLength = that.Parts.Length;var maxLength = Math.Max(thisLength, thatLength);for(var i =0; i < maxLength; i++){var thisPart = i < thisLength ?this.Parts[i]:0;var thatPart = i < thatLength ? that.Parts[i]:0;if(thisPart < thatPart)return-1;if(thisPart > thatPart)return1;}return0;}}
Test:
Version a, b;
a =newVersion("4.2.1");
b =newVersion("4.2.6");
a.CompareTo(b);// a < b : -1
a =newVersion("2.8.4");
b =newVersion("2.8.0");
a.CompareTo(b);// a > b : 1
a =newVersion("5.2");
b =null;
a.CompareTo(b);// a > b : 1
a =newVersion("3");
b =newVersion("3.6");
a.CompareTo(b);// a < b : -1var versions =newList<Version>{newVersion("2.0"),newVersion("1.1.5"),newVersion("3.0.10"),newVersion("1"),null,newVersion("1.0.1")};
versions.Sort();foreach(var version in versions)
Console.WriteLine(version?.ToString()??"NULL");