【问题标题】:Sort list in C# with LINQ使用 LINQ 在 C# 中排序列表
【发布时间】:2010-10-23 11:57:20
【问题描述】:

我想在 C# 中对列表进行排序。

就像结构属性 AVC 变为 true 然后先显示它们,然后 AVC 变为 false。有什么方法可以在 C# LINQ 中做到这一点?

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    嗯,使用 LINQ 的最简单方法是这样的:

    list = list.OrderBy(x => x.AVC ? 0 : 1)
               .ToList();
    

    list = list.OrderByDescending(x => x.AVC)
               .ToList();
    

    相信bool值的自然顺序是false < true,但第一种形式让IMO更清楚,因为每个人都知道0 < 1

    请注意,这不会对原始列表本身进行排序 - 它会创建一个新列表,并将引用分配回list 变量。如果要就地排序,应该使用List<T>.Sort方法。

    【讨论】:

    • 这里需要 .ToList() 吗?
    • @KrishnaPS:是的,假设list 的编译时类型是List<T>。否则,您将尝试将 IEnumerable<T> 分配给 LIst<T> 变量。如果你只需要一个序列,每次迭代它时都会懒惰地评估它,你就不需要它。
    • 。谢谢!那么 order by 返回一个懒惰评估的列表?我在这里错过了什么吗?对不起,我很困惑?我面临的情况是,我已经订购了列表并将其作为 IEnumerable 如上所述返回,但是当我对返回的列表中的每个执行一个更改值时,我看到顺序被打乱了..
    • @KrishnaPS: OrderBy 返回一个序列,而不是一个列表。听起来你应该问一个新问题来证明你的问题。
    • 请帮我解决我在stackoverflow.com/questions/41738008/…发布的这个问题
    【解决方案2】:

    像这样?

    在 LINQ 中:

    var sortedList = originalList.OrderBy(foo => !foo.AVC)
                                 .ToList();
    

    或就地:

    originalList.Sort((foo1, foo2) => foo2.AVC.CompareTo(foo1.AVC));
    

    正如 Jon Skeet 所说,这里的诀窍是知道 false 被认为比 true.“小”

    如果您发现您在代码中的许多不同位置执行这些排序操作,您可能希望使用您的类型 Foo 来实现 IComparable<Foo>IComparable 接口。

    【讨论】:

      【解决方案3】:

      我假设您还希望它们按其他方式排序,以便在 AVC 相同的所有项目之间获得一致的排序。例如按名称:

      var sortedList = list.OrderBy(x => c.AVC).ThenBy(x => x.Name).ToList();
      

      【讨论】:

        【解决方案4】:

        已接受答案的替代语法:

        list = from item in list
               orderby item.AVC
               select item;
        

        请记住,“列表”现在是 IEnumerable 对象,而不是 List 对象。

        【讨论】:

          猜你喜欢
          • 2020-04-01
          • 2021-11-24
          • 2018-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-16
          • 1970-01-01
          • 2021-10-23
          相关资源
          最近更新 更多