Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# - String sorting by other string as helper

Tags:

c#

.net

sorting

Is there a .NET build-in method that would solve my scenario?

  1. Got an array of strings ex. { "Mark", "Tom", "Mat", "Mary", "Peter" }
  2. I use string "Ma" as sorting string helper
  3. My array result is { "Mark", "Mary", "Mat", "Tom", "Peter" }

I know that function solving this would be easy, but I'am interested is such method exists.

PS. Using .NET 4.0

like image 987
EOG Avatar asked Nov 16 '11 15:11

EOG


2 Answers

Using .Net 3.5 (and above) the OrderByDescending and ThenBy methods in Linq will be able to do what you want. eg:

var ordered = strings.OrderByDescending(s => s.StartsWith("Ma")).ThenBy(s => s);
like image 184
Rich O'Kelly Avatar answered Sep 21 '22 23:09

Rich O'Kelly


I think that method does not exist.
I solved with this:

public static string[] Sort(this string[] list, string start)
{
    List<string> l = new List<string>();
    l.AddRange(list.Where(p => p.StartsWith(start)).OrderBy(p => p));
    l.AddRange(list.Where(p => !p.StartsWith(start)).OrderBy(p => p));
    return l.ToArray();
}

So you can do

string[] list = new string[] { "Mark", "Tom", "Mat", "Mary", "Peter" };
string[] ordered_list = list.Sort("Ma");

If you need to order elements with your string and leave others unsorted, use this:

public static string[] Sort(this string[] list, string start)
{
    List<string> l = new List<string>();
    l.AddRange(list.Where(p => p.StartsWith(start)).OrderBy(p => p));
    l.AddRange(list.Where(p => !p.StartsWith(start)));
    // l.AddRange(list.Where(p => !p.StartsWith(start)).OrderByDescending(p => p));
    return l.ToArray();
}
like image 29
Marco Avatar answered Sep 20 '22 23:09

Marco