static List<Tuple<int, double, string>> GetDescendingQualityHeaderValues(string[] rawHeaders)
{
var list = new List<Tuple<int, double, string>>(rawHeaders.Length);
var index = 0;
foreach (var item in rawHeaders)
{
var splitted = item.Split(';');
if (splitted.Length == 1)
{
list.Add(Tuple.Create(index++, 1.0, splitted[0].Trim()));
}
else if (splitted.Length == 2)
{
var name = splitted[0].Trim();
var rawQ = splitted[1];
var q = 1.0;
var qSplitted = rawQ.Split('=');
if (qSplitted.Length == 2 && qSplitted[0].Trim().Equals("q", StringComparison.OrdinalIgnoreCase) && double.TryParse(qSplitted[1], out q))
{
list.Add(Tuple.Create(index++, q, name));
}
else
{
list.Add(Tuple.Create(index++, 1.0, name));
}
}
}
// needs stable sort, compare quality first, second compare index
list.Sort((a, b) =>
{
int c = b.Item2.CompareTo(a.Item2);
if (c != 0) return c;
return a.Item1.CompareTo(b.Item1);
});
return list;
}