The following code shows how to use custom Comparer with OrderByDescending operator.
using System; using System.Linq; using System.Collections; using System.Collections.Generic; class Program/*from w w w .j a v a2 s .c om*/ { static void Main(string[] args) { string[] codeNames = { "Python", "Java", "Javascript", "Bash", "C++", "Oracle" }; MyVowelToConsonantRatioComparer myComp = new MyVowelToConsonantRatioComparer(); IEnumerable<string> namesByVToCRatio = codeNames .OrderByDescending((s => s), myComp); foreach (string item in namesByVToCRatio) { int vCount = 0; int cCount = 0; myComp.GetVowelConsonantCount(item, ref vCount, ref cCount); double dRatio = (double)vCount / (double)cCount; Console.WriteLine(item + " - " + dRatio + " - " + vCount + ":" + cCount); } } } public class MyVowelToConsonantRatioComparer : IComparer<string> { public int Compare(string s1, string s2) { int vCount1 = 0; int cCount1 = 0; int vCount2 = 0; int cCount2 = 0; GetVowelConsonantCount(s1, ref vCount1, ref cCount1); GetVowelConsonantCount(s2, ref vCount2, ref cCount2); double dRatio1 = (double)vCount1 / (double)cCount1; double dRatio2 = (double)vCount2 / (double)cCount2; if (dRatio1 < dRatio2) return (-1); else if (dRatio1 > dRatio2) return (1); else return (0); } public void GetVowelConsonantCount(string s, ref int vowelCount, ref int consonantCount) { string vowels = "AEIOU"; vowelCount = 0; consonantCount = 0; string sUpper = s.ToUpper(); foreach (char ch in sUpper) { if (vowels.IndexOf(ch) < 0) consonantCount++; else vowelCount++; } return; } }