【问题标题】:changing item position in a list更改列表中的项目位置
【发布时间】:2013-01-08 06:48:59
【问题描述】:

我有这段代码,我通过它过滤并获得一组组

var groups = Items.Select(g => g.Category).Distinct(); 

现在在列表中我还得到一个空组“”,我想将其放在组中的最后一个索引处。有人可以告诉我该怎么做。

【问题讨论】:

  • 为什么不使用 .OrderBy(g => g.Category)?
  • 是按字母顺序排列组的顺序..如果那样的话我不想要那个..Distinct 会将它们分组,因为它们出现在项目列表中,这就是我想要的..唯一剩下要做的就是将“”值移到末尾。

标签: c# linq linq-to-objects


【解决方案1】:

不完全是,您需要双重订购。如果您使用上面的 orderby,您将首先获得空字符串。

var groups = Items.Select(g => g.Category).Distinct()
                                          .OrderBy(g => g.Length==0)
                                          .ThenBy(g=>g.Category);

现在空组将排在最后,其余的将按字母顺序排列。

【讨论】:

    【解决方案2】:

    如果您想保留原始订单,那么您可以尝试以下操作。

    var temp = Items.Where(r => r.Category != "").Distinct().ToList();
    if (Items.Any(r=> r.Category == ""))
        temp.Add("");
    

    获取没有空字符串Category 的项目列表,然后查看您的原始集合是否包含空组,然后您可以将其添加到集合的末尾。

    【讨论】:

    • 这行得通..谢谢大家的超级快速和有用的回复。
    【解决方案3】:

    这可能有助于做到这一点而不影响类别项目的顺序

    var WithoutNull =
    (from item in Items
    where !string.IsNullOrEmpty(item.Category)
    select item.Category).ToList();
    
    var WtihNull=
    from item in db.SomeTable
    where string.IsNullOrEmpty(item.Category)
    select item.Category).ToList();
    
    var allvalues= WithoutNull.Concat(WtihNull)
                                       .ToList();
    

    我认为orderbyOrderByDescending 子句会为您轻松完成工作...根据您的需要申请

    var groups = Items.Select(g => g.Category).Distinct().OrderBy(g => g.Key);
    

    var groups = Items.OrderBy(g => g.Category).Select(g => g.Category).Distinct();
    

    【讨论】:

    • OrderBy 不会将空字符串从列表中移到列表末尾,而是将其作为第一项。
    • 是的,但我不确定这是否是所需的要求。
    • 所以我只需要检查列表中具有“”值的给定项目并将其移动到最后一个而不干扰其他项目的顺序。
    • 没有人,OrderByDescending 还会从 Z-A 而不是 A-Z 对其余项目进行排序。请在下面查看我的建议。
    【解决方案4】:

    过滤掉空字符串(不确定是不是名字):

    var groups = Items.Select(g => g.Category).Where(g => g.Name != "").Distinct(); 
    

    如果您需要将空字符串放在列表中并且不想排序,则必须将其删除并将其添加到末尾。

    【讨论】:

      【解决方案5】:

      您可以创建自己的IComparator 实现来执行自定义排序。在其中,您可以决定将空字符串与其他字符串相比放在哪里。

      例如,请参阅here

      【讨论】:

        【解决方案6】:

        OrderBy 可以使用一些巧妙的排序标准,例如

        var groups = Items.Select(g => g.Category).Distinct().OrderBy(
             g => string.IsNullOrEmpty(g.Category) ? 2 : 1);
        

        本质上,我们要说的是,除了那些为空的(假设类别是空的关键)之外,所有的组就顺序而言都是等价的。根据实际的排序算法,其他项目仍有可能重新排列。

        编辑:经过测试及以上适用于内存列表。不确定当 Items 为 IQueryAble 时会发生什么。

        【讨论】:

          【解决方案7】:

          如果您不想更改其余集合的顺序。你可以这样做。

           var emptyCategory = Items.Where((r) => r.Category == string.Empty);
           var groups = Items.Where((r) => r.Category != string.Empty).Union(emptyCategory);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-12-11
            • 2014-06-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多