【问题标题】:How to sort List<List<string>> according to List<string> number of fields?如何根据 List<string> 字段数对 List<List<string>> 进行排序?
【发布时间】:2010-10-17 19:40:51
【问题描述】:

如何根据字段数对 List> 进行排序?

列表的结构类似于

a|b|c|d|eeee|rere|ewew|
ewqewq|ewew|
ewew|ewewewewew|

通过排序我想根据块数(asc/desc)来做

编辑

&lt;list&lt;list&lt;string&gt;&gt; is "items" 和我通过 items[0] 访问每个列表

这些项目[xx] 是一个列表,这意味着我希望它们对数组进行排序

    a|b|c|d|eeee|rere|ewew|
    a|b|c|d|eeee|rere
    a|b|c|d|eeee

【问题讨论】:

    标签: c# list sorting


    【解决方案1】:

    如果您不需要“就地”排序,您可以使用 LINQ 为您提供一个新的排序列表。

    var sorted = oldList.OrderBy( l => l.Count );
    

    否则,您将需要编写自己的比较器,该比较器接受两个列表并按其大小返回排序。

    public class CountComparer : IComparer<List<string>>
    {
        #region IComparer<List<string>> Members
    
        public int Compare( List<string> x, List<string> y )
        {
            return x.Count.CompareTo( y.Count );
        }
    
        #endregion
    }
    
    
    
    oldList.Sort( new CountComparer() );
    

    或者,正如@Josh 指出的那样,您可以使用 lambda 表达式来做到这一点。

    oldList.Sort( (a,b) => a.Count.CompareTo( b.Count ) )
    

    如果比较相对简单或只使用一次,IMO 后者效果很好,但实际类可能更可取,因为比较变得更加复杂,或者如果您需要在多个地方重复它。

    【讨论】:

    • oldList.Sort( (a,b) => a.Count.CompareTo( b.Count ) ) -在这里,我应该写什么而不是 a 和 b?
    • Nothing -- a 和 b 是 lambda 表达式的占位符,在调用比较时将从外部列表中分配值。
    【解决方案2】:
    List<List<string>> list; // filled elsewhere
    list.Sort((x,y) => x.Count.CompareTo(y.Count););
    

    【讨论】:

      【解决方案3】:
      List<List<string>> strings = new List<List<string>>();
      
      // add your strings
      
      strings = new List<List<string>>(from str in strings orderby str.Count select str);
      

      显然,您可以调整它以适应您的场景,但这应该让您大致了解如何创建一个列表,该列表按另一个列表中特定字符串中的元素数量排序。

      【讨论】:

        【解决方案4】:

        您可以使用 sort 方法进行排序,方法是创建自己的比较器或给它一个 Comparison&lt;T&gt; 类型的委托。

        ls.Sort((x, y) => x.Count.CompareTo(y.Count));
        

        这是一个示例,展示如何使用 lambda 表达式进行比较。

        编辑

        反转排序的一个非常简单的方法是乘以负数 -1

        ls.Sort((x, y) => -1 * x.Count.CompareTo(y.Count));
        

        【讨论】:

        • 这是按 ASC 顺序对我的列表进行排序,我该如何恢复它?
        • 另一种(也是非常简单的)反转方法是在 lambda 箭头的一侧交换 xy,如 (x, y) =&gt; y.Count.CompareTo(x.Count)
        【解决方案5】:

        只是一个小的调整,同时也检查null

                List<List<string>> listOfLists = new List<List<string>>();
        
                List<string> list1 = new List<string>();
                list1.Add("elem 1 1");
                list1.Add("elem 1 2");
                list1.Add("elem 1 3");
        
                List<string> list2 = new List<string>();
                list2.Add("elem 2 1");
                list2.Add("elem 2 2");
                list2.Add("elem 2 3");
                list2.Add("elem 2 4");
        
                listOfLists.Add(list1);
                listOfLists.Add(null); // list can contain nulls
                listOfLists.Add(list2);
                listOfLists.Add(null); // list can contain nulls
        

        当列表列表中有空列表时,您可能希望通过将 null.Count 解释为 -1 或 NOT 来使它们的优先级低于空列表

                int nullListElems = -1; 
                //int nullListElems = 0; 
        
                listOfLists.Sort((l1,l2)=> 
                    l1 == null ? 
                    nullListElems : 
                    l1.Count.CompareTo(
                        l2 == null ? 
                        nullListElems : 
                        l2.Count));
        

        【讨论】:

          猜你喜欢
          • 2017-11-02
          • 1970-01-01
          • 1970-01-01
          • 2019-07-02
          • 2020-11-18
          • 2016-06-26
          • 1970-01-01
          • 1970-01-01
          • 2021-03-26
          相关资源
          最近更新 更多