【问题标题】:How to sort part of items in generic list如何对通用列表中的部分项目进行排序
【发布时间】:2011-06-27 18:00:21
【问题描述】:

我有一个 List 对象,其中包含以下类型的项目

public class Item{

    public int Type; //this can be only 0 or 1
    public string Text;


}

我想先按类型对整个列表进行排序,然后再按文本对类型为 1 的项目进行排序?

如何做到这一点?

非常感谢

【问题讨论】:

  • 那么,如果 type 只能是 0 或 1,这不是使用 enum 的好时机吗? public enum MyType { TypeA = 0, TypeB = 1 };
  • 你试过什么?是否需要作为两个单独的调用来完成(因此用户可以选择“order by: type”或“filter by: type”)?

标签: c# linq list sorting


【解决方案1】:

这就是我的做法。

var ordered = list.OrderBy(i => i.Type == 0 ? "" : i.Text);

这是假设 i == 0 处不存在空文本字符串。如果您无法做出该假设,则以下方法可行:

var ordered = list.OrderBy(i => i.Type).ThenBy(i => i.Type == 0 ? "" : i.Text);

通过为所有带有 0 类型的项目赋予相同的值,您将让它们保持初始顺序,同时按其 Text 值对其他项目进行排序。

顺便说一句,这是代码异味:

public int Type; //this can be only 0 or 1

乍一看,这听起来应该是布尔值或自定义 enum 类型。在深入了解您正在尝试做的事情之后,如果 Type 为 0,听起来您可能并不期望 Text 甚至是合法值。如果是这种情况,您应该考虑使用类继承来实际区分一种物品类型。

【讨论】:

    【解决方案2】:

    你的问题不是很清楚。听起来您想要两种不同的排序,而不是在一个字段上排序,然后在 Type 等于 1 时进行稳定的重新排序?

    假设前者:

    var sortByType = items.OrderBy(x => x.Type)
                          .ToList();
    var sortTheOnesByText = items.Where(x => x.Type == 1)
                                 .OrderBy(x => x.Text)
                                 .ToList();
    

    【讨论】:

      【解决方案3】:
      List<Item> items;
      
      items = items.OrderBy(i => i.Type).ThenBy(i => i.Type == 1 ? i.Text : null);
      

      【讨论】:

        【解决方案4】:

        实现IComparable&lt;Item&gt; 请参阅示例msdn 的详细信息 而不仅仅是使用List&lt;T&gt;.Sort() 方法

        【讨论】:

        【解决方案5】:

        我认为您的意思是要将所有 type=0 放在前面,所有 type=1 放在后面,并且还按 type=1 的文本排序。

        items.OrderBy(item => item.Type).ThenBy (item => type == 0 ? "" : item.Text)
        

        【讨论】:

          【解决方案6】:

          如果您不介意订购 Type 0 商品,那么您可以这样做

          var sortedItems = items.OrderBy(i => i.Type).ThenBy(i => i.Text);
          

          否则,如果您需要保留Type 0项目的原始顺序,那么您可以这样做

          var sortedItems = items.OrderBy(i => i.Type).ThenBy(i => i.Type == 0 ? "A" : i.Text);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-06-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多