0

I have a Category class

public class Category
{
   public long Id { get; set; }
   public Translation[] Translations { get; set; }
}

and a Translation class

public  class Translation
{
   public string Locale { get; set; }
   public string Name { get; set; }
}

I then have a List of Categories List<Category> that is populated with category objects. I want to order my unorderedCategoryList alphabetically by the Name field in Translation based on specified Locale.

So for example I have 3 categories:

{1, ["EN","aaa"], ["RU","zzz"]}

{2, ["EN","ccc"], ["RU","eee"]}

{3, ["EN","bbb"], ["RU","aaa"]}

Ordering them with specified locale EN would result in a list ordered like this:

{1, ["EN","aaa"], ["RU","zzz"]}
{3, ["EN","bbb"], ["RU","aaa"]}
{2, ["EN","ccc"], ["RU","eee"]}

and by RU like this:

{3, ["EN","bbb"], ["RU","aaa"]}
{2, ["EN","ccc"], ["RU","eee"]}
{1, ["EN","aaa"], ["RU","zzz"]}

This line of code is as far as I got but it doesn't seem to work :

var sortedList = unorderedCategoryList.OrderBy(go => go.Translations.Where(t => t.Locale == "EN").Select(t => t.Name)).ToList();
Deividas
  • 79
  • 1
  • 9

2 Answers2

1

You could create a Custom Comparer for Category Type as follows.

public class CategoryComparer : IComparer<Category>
{
    private string _locale;
    public CategoryComparer(string locale)
    {
        _locale = locale;
    }
    public int Compare(Category x, Category y)
    {
        var orderedX = x.Translations.Where(c=>c.Locale.Equals(_locale)).OrderBy(c=>c.Name);
        var orderedY = y.Translations.Where(c=>c.Locale.Equals(_locale)).OrderBy(c=>c.Name);
        return orderedX.First().Name.CompareTo(orderedY.First().Name);
    }
}

Now you could sort as

var sortByKey = "EN";
var orderedList = list.OrderBy(x=>x,new CategoryComparer(sortByKey));

Demo Code

Anu Viswan
  • 17,797
  • 2
  • 22
  • 51
0

Try this out:

var sortedList = unorderedCategoryList
                    .OrderBy(go => go.Translations.OrderByDescending(t => t.Name == "EN")).ToList();

Unverified but I pulled sources from here and here

Selthien
  • 1,178
  • 9
  • 33