LinQ OrderBy специфицирует элемент c в подсписке - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть класс Category

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

и класс перевода

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

У меня есть список категорий List<Category>, который заполняется объектами категорий. Я хочу упорядочить мой unorderedCategoryList в алфавитном порядке по полю Name в Translation на основе указанного Locale .

Так, например, у меня есть 3 категории:

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

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

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

Упорядочение их с указанным языком EN приведет к списку, упорядоченному следующим образом:

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

и на RU вот так:

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

Эта строка кода, насколько я понял, но, похоже, не работает:

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

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Вы можете создать пользовательский компаратор для типа категории следующим образом.

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);
    }
}

Теперь вы можете сортировать как

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

Демонстрационный код

0 голосов
/ 15 апреля 2020

Попробуйте:

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

Непроверено, но я извлек источники из здесь и здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...