【问题标题】:How to order a collection with LINQ so that a particular string appears first [duplicate]如何使用 LINQ 对集合进行排序,以便特定字符串首先出现 [重复]
【发布时间】:2014-01-06 18:43:22
【问题描述】:

我有一个字符串值数组,{ "Jools", "Jops", "Stoo", "RJ" }

我想对它进行排序,以便 "Jops" 在列表中排在第一位,但我不关心其他值的顺序。多个值也可以,所以 "Jops" 的所有实例都应该首先出现.

有没有使用 LINQ 的简单方法?

【问题讨论】:

  • Jops 从来没有出现在 Jools 之前......好吧,除非是在他的尸体上;-) 伙计,我喜欢那场比赛。 +1 回忆。
  • 你为什么要先有工作,因为字母顺序?还是只有乔普斯永远是第一位的?
  • 我的实际数据是一堆类型,其中一种是主要的,其余的都是杂项。我想先显示主要的,其余的按任意顺序显示
  • 我确定我之前已经在某个地方回答过这个问题,但找不到真正的问题... :)
  • 似乎是重复的,但重复的问题标题有点裤子。难怪我搜的时候没找到!

标签: c# .net linq


【解决方案1】:

怎么样

var values = new string[] { "Jools", "Jops", "Stoo", "RJ" };
var sortedValues = values.OrderByDescending(s => s.Equals("Jops"));

只需按是否是您想要的值进行排序。

编辑在下面的 cmets 中提到了一个非常有价值的点,其余项目不按此机制排序。为了保证它们的顺序,请使用 ThenBy( ) 方法。

【讨论】:

  • 大概是迭代和评估真、假、假、假并以此为基础对其进行排序?
  • 我注意到这将使其余部分变得不确定,以解决额外的ThenBy 可以对其余部分进行排序。或者将所有这些都放在对OrderBy 的一次调用中,使用采用IComparer 的重载。
  • 反之亦然:)
  • @BartoszKP 你完全正确 - 已修复!
  • @AdamHouldsworth 这很重要:如果从比较中给出不一致的结果(例如 A > B 但在下一个比较中 B > A),排序可能会做一些奇怪的事情。但不是使用ThenBy,而是有一个比较器,当两个值都不是“Jools”时,它代表默认值。
【解决方案2】:

我建议使用排序列表并编写您自己的比较器:http://msdn.microsoft.com/en-us/library/system.collections.icomparer(v=vs.110).aspx

【讨论】:

    【解决方案3】:

    如果您的意思是 "Jops" 硬编码,那么这样就可以了:

    var result = values
        .Where(x => x == "Jops")
        .Concat(values.Where(x => x != "Jops"));
    

    更短的版本:

    var result = values
        .OrderByDescending(s => s.Equals("Jops"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      相关资源
      最近更新 更多