如何在考虑多个因素的情况下对列表进行排序?

时间:2018-11-17 13:58:00

标签: c# list sorting sql-order-by

我看到了大量关于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 :(得分:3)

你为什么不能这样呢?

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)

这给了我以下结果:

  • 真箭头
  • 框为真
  • 可以为真
  • 假苹果
  • 假船