【问题标题】:How to Sort a list taking in account multiple factors?如何考虑多个因素对列表进行排序?
【发布时间】:2018-11-17 13:57:59
【问题描述】:

我看到很多帖子都在谈论 OrderBy().ThenBy()、Sort()、IComparable 等等。但我无法正确排序我的列表。

我需要按结果(字符串)以及配方是否可制作对配方列表进行排序。这将使可制作的食谱按字母顺序排列在列表的顶部,而不可制作的食谱出现在下面也按字母顺序排序(结果是一个字符串,即项目的名称)。像这样的:

之前:

  • “箭头”:可制作
  • “船”:不可制作
  • “苹果”:不可制作
  • “盒子”:可制作
  • “可以”:可制作

之后

  • “箭头”:可制作
  • “盒子”:可制作
  • “可以”:可制作
  • “苹果”:不可制作
  • “船”:不可制作

这将确保我的球员获得最佳结果。 这大概是 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 排序,但这会很无聊。我想要更好更有趣的东西。

我很想知道这里性能最高的是哪一个,因为我最终可以每秒处理数百万个食谱。

提前感谢您的帮助。

【问题讨论】:

  • 你能用.OrderBy().ThenBy()展示你的尝试吗?
  • 您可以简单地为此编写自己的比较函数。
  • @John 是的,现在没那么多。一旦我回到我的电脑,也许。但它看起来很像 Dmitry S 解决方案,只是将 ThenBy 上的 x 替换为 r。
  • @AlKepp 我想看看在走这条路线之前是否还有其他选择。
  • @MultipleGameStyles 在这种情况下,它实际上并不意味着您在 lambda 中使用的变量名称。您可以使用rx 或任何其他名称。它只是指向Recipe 类的实例。

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


【解决方案1】:

你为什么不能这样做?

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)

这给了我以下结果:

  • 箭头正确
  • 框真
  • 可以是真的
  • 苹果假
  • 船假

【讨论】:

  • 因为这只会给我返回一个按 a-z 排序的列表,很奇怪。也许我做错了什么?
  • @Multiple 你能更新你的答案并展示你是如何做到的吗?
  • @Multiple example with Dmitry's code - 看起来与您想要的排序顺序完全一样。
  • @DmitryS 已更新!
  • @Aldert 他第一次回答时不在问题中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多