Как отсортировать список с учетом нескольких факторов? - PullRequest
0 голосов
/ 17 ноября 2018

Я видел тонну сообщений, в которых говорилось о OrderBy (). ThenBy (), Sort (), IComparable и тому подобном. Мне не удалось правильно отсортировать список.

Мне нужно отсортировать список рецептов a-z по результату (строке) и, если рецепт можно обработать. Это сделало бы готовые рецепты в верхней части списка, отсортированного по алфавиту, а неприготовленные рецепты появились ниже, также отсортированные по алфавиту (в результате получается строка, название элемента). Примерно так:

До:

  • "стрелка": Ковка
  • "лодка": не-Ковка
  • "яблоко": не-Ковка
  • "коробка": Ковка
  • "может": Ковка

После

  • "стрелка": Ковка
  • "окно": Ковка
  • "может": Ковка
  • "яблоко": не-Ковка
  • "лодка": без Ковка

Это обеспечит лучший результат для моих игроков. Примерно так выглядит класс Recipe:

public class Recipe : ScriptableObject
{
    public Ingredient[] ingredients;

    public string result;
    public bool Craftable => //Not so complex and boring logic here;
}

Вот как я сейчас пытаюсь это сделать:

Recipe[] recipes = _recipes.OrderBy(r => r.Craftable).ThenBy(r => r.result).ToArray();

Это сортирует a-z, но не отделяет подготавливаемые и не поддающиеся обработке.

Я был бы рад узнать, есть ли уже вопрос с ответом, и если он окажется дубликатом.

Кроме того, я знаю, что я мог бы сделать это, просто отделив готовые Рецепты от необрабатываемых в двух разных массивах, а затем отсортировав их a-z по отдельности, но это было бы просто скучно. Я хочу что-то лучше и веселее.

Мне бы хотелось узнать, какой маршрут наиболее эффективен, потому что я могу обработать миллионы рецептов в секунду.

Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 17 ноября 2018

Почему вы не можете сделать именно так?

var res = recipes.OrderBy(r => !r.Craftable).ThenBy(x => x.result);

ОБНОВЛЕНИЕ:

Я проверил свое решение.Выглядит все в порядке:

var recipes = new List<Recipe>
{
    new Recipe { result = "arrow", Craftable = true},
    new Recipe { result = "boat", Craftable = false},
    new Recipe { result = "apple", Craftable = false},
    new Recipe { result = "can", Craftable = true},
    new Recipe { result = "box", Craftable = true}

};

var res = recipes.OrderBy(r => !r.Craftable).ThenBy(x => x.result);  
// note !r.Craftable in OrderBy clause, it means we first take craftable

Вы также можете заставить его работать следующим образом.Он выводит тот же результат:

var res = recipes.OrderByDescending(r => r.Craftable).ThenBy(x => x.result);
// false = 0, true = 1, so we sort Craftable by descending, first 1 (Craftable = true), then 0 (Craftable = false)

Это дает мне следующий результат:

  • стрелка True
  • box True
  • can True
  • яблоко False
  • лодка False
...