using System.Collections.Generic;
public static void Main(string[] args)
List<string> versionsList = new List<string>();
versionsList.Add("1.3.0-rc2-20119-1000");
versionsList.Add("1.3.0-rc2-20107-3546");
versionsList.Add("1.1.0-rc2-564-123");
versionsList.Add("1.1.1");
versionsList.Add("1.1.2");
versionsList.Add("1.1.0");
versionsList.Add("1.1.0-rc2");
versionsList.Add("1.2.0-rc1-20115-1000");
versionsList.Add("1.3.0-rc2");
versionsList.Add("1.2.0");
versionsList.Add("1.3.0");
versionsList.Add("1.3.0-rc2-20119-1245");
versionsList.Add("1.3.0-rc3");
var versions = versionsList.Select(text => new Version(text)).OrderByDescending(version => version);
foreach (var version in versions)
Console.WriteLine(version);
class Version : IComparable<Version>
public string Raw { get; set; }
public int Major { get; set; }
public int Minor { get; set; }
public int Patch { get; set; }
public string Label { get; set; }
public string Metadata { get; set; }
public Version(string text)
var data = new String(text.TakeWhile(c => '-' != c && '-' != c).ToArray()).Split('.');
Major = Int32.Parse(data[0]);
Minor = data.Length > 1 ? Int32.Parse(data[1]) : 0;
Patch = data.Length > 2 ? Int32.Parse(data[2]) : 0;
Label = GetToken('-', text, "label");
Metadata = GetToken('-', text, "metadata");
private string GetToken(char token, string text, string type)
return new String(text.SkipWhile(c => c != token).Skip(1).TakeWhile(c => '-' != c && '-' != c).ToArray());
public int CompareTo(Version other)
if (this.Major != other.Major)
return this.Major.CompareTo(other.Major);
if (this.Minor != other.Minor)
return this.Minor.CompareTo(other.Minor);
if (this.Patch != other.Patch)
return this.Patch.CompareTo(other.Patch);
if (this.Label != other.Label)
return this.Label.CompareTo(other.Label);
if (!String.IsNullOrWhiteSpace(this.Metadata) && String.IsNullOrWhiteSpace(other.Metadata))
if (String.IsNullOrWhiteSpace(this.Metadata) && !String.IsNullOrWhiteSpace(other.Metadata))
public override string ToString()