【问题标题】:Sort List except one entry with LINQ使用 LINQ 对列表进行排序,但一项除外
【发布时间】:2013-04-23 01:31:54
【问题描述】:

我想订购一个字符串列表,但列表中的一个字符串应始终位于开头且未排序。使用 LINQ 最简单的方法是什么?

//should be ordered in: first, a,b,u,z:
List<string> l = {"z","u","first","b","a"};  

LINQ 中没有 prepend 方法或其他东西,是吗?

【问题讨论】:

    标签: c# linq sorting


    【解决方案1】:
    l = l.OrderBy(i => i != "first").ThenBy(i => i).ToList();
    

    这里的诀窍是根据相关商品是否是您的特殊商品进行排序,然后像往常一样按照您的商品排序。

    既然您说要订购一个列表(使用 linq),请不要忘记将查询结果分配回列表。


    你还问了一个 prepend 方法,这个怎么样:

    l = new[] { "first" }.Concat(l).ToList();
    

    您可以轻松地将其作为扩展方法:

    public static class LinqExtensions
    {
        public static IEnumerable<T> Prepend<T>(this IEnumerable<T> query, T item)
        {
            return new[] { item }.Concat(query);
        }
    }
    

    称为:

    l = l.Prepend("first").ToList();
    

    【讨论】:

    • i != "first"让我微笑:)
    • 如果我们有 2 个或更多条目要豁免,怎么样?
    • @IvanMatala: !new [] {"first", "2"}.Contains(i)
    • @GeorgeDuckett,太好了!我只是不明白OrderBy(i =&gt; i != "first") 如何将“第一”放在列表的开头。你介意解释一下吗?
    • @Marcello 对于我们首先想要的项目,表达式的计算结果为 false,对所有其他项目计算为 true。按布尔值排序首先具有假值(我们的项目),然后是真值(所有其他)。
    【解决方案2】:

    您可以使用OrderByThenBy 模式:

    string[] l = { "z", "u", "first", "b", "a" };
    
    var result = l.OrderBy(i => i != "first").ThenBy(i => i);
    

    【讨论】:

      【解决方案3】:

      按两个标准排序。第一个标准基于某种谓词,第二个标准基于项目的价值:

      [TestMethod]
      public void TestMethod1()
      {
          var list = new[] { "z", "u", "first", "b", "a" }.OrderByPredicateFirst(s => s == "first").ToList();
          Assert.AreEqual("first", list[0]);
          Assert.AreEqual("a", list[1]);
          Assert.AreEqual("b", list[2]);
          Assert.AreEqual("u", list[3]);
          Assert.AreEqual("z", list[4]);
      }
      
      public static class Extensions
      {
          public static IEnumerable<T> OrderByPredicateFirst<T>(this IEnumerable<T> source, Predicate<T> firsts)
          {
              return source
                .OrderBy(s => firsts(s) ? 0 : 1)
                .ThenBy(s => s);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-06-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多