Asim - 7 months ago 59
C# Question

# Sort String List Numerically

I have a following string list:

``````List<string> a = new List<string>();

``````

When I call the sort function
`a.sort()`
it sorts like this:

``````2015
2015 /M1
2015 /M11
2015 /M12
2015 /M2
2015 /M3
2015 /M4
2015 /M5
2015 /M6
2015 /M7
2015 /M8
2015 /M9
``````

But how can I modify to make it look like below.

``````2015
2015 /M1
2015 /M2
2015 /M3
2015 /M4
2015 /M5
2015 /M6
2015 /M7
2015 /M8
2015 /M9
2015 /M10
2015 /M11
2015 /M12
``````

I have same pattern in other list items as well like 2015 Q/12, 2015 Q/11 etc.

You need to extract the number from string, it can be done by regex. Then convert it to integer and sort by it.

``````var e = from s in a
let g = Regex.Match(s, @"^\d+(?: \/[MQ](\d+))?\$")
let n = g.Groups[1].Value != "" ? int.Parse(g.Groups[1].Value) : (int?)null
orderby n
select s;

a = e.ToList();
``````

### Edit

To sort by year first, then use following code

``````var e = from s in a
let g = Regex.Match(s, @"^[A-Za-z]*(\d+)(?: \/[MQ](\d+))?\$")
let y = g.Groups[1].Value != "" ? int.Parse(g.Groups[1].Value) : 0
let m = g.Groups[2].Value != "" ? int.Parse(g.Groups[2].Value) : 0
orderby y, m
select s;
``````
Source (Stackoverflow)