Sorting a list of strings by placing words starting with a certain letter at the start

c#, linq, list

Solution

You're getting a case-sensitive comparison, and also you need `OrderByDescending()`. A quick and dirty way to achieve the case-insensitivity is `ToLowerInvariant()`:

var result = list.Where(x => x.ToLowerInvariant().Contains("ou"))
                    .OrderByDescending(x => x.ToLowerInvariant().StartsWith("ou"))
                    .Select(x => x);

Live example: http://rextester.com/GUR97180

This previous answer shows the correct way to do a case insensitive comparison (ie, dont use my example above, its bad)

Problem

Assuming I have the following list: ``` IList<string> list = new List<string>(); list.Add("Mouse"); list.Add("Dinner"); list.Add("House"); list.Add("Out"); list.Add("Phone"); list.Add("Hat"); list.Add("Ounce"); ``` Using LINQ how would I select the words containing "ou" and sort the selection such that the words beginning with "ou" are listed at the start and then the words containing but not starting with "ou" are subsequently listed. The list I'm trying to create would be: ``` Ounce Out House Mouse ``` I came up with the following but it is not working: ``` list.Where(x => x.Contains("ou")) .OrderBy(x => x.StartsWith("ou")) .Select(x => x); ```

Original source

Related problems