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

3

如何按字段数量对List<List<string>>进行排序?

该列表的结构如下:

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

按块数排序(升序/降序)

编辑

<list<list<string>> 是“items”,我通过 items[0] 访问每个列表

这些 items[xx] 都是列表,因此我希望对数组进行排序

    a|b|c|d|eeee|rere|ewew|
    a|b|c|d|eeee|rere
    a|b|c|d|eeee
5个回答

9
如果您不需要“原地”排序,可以使用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 ) )

如果比较相对简单或仅用一次,则后者很有效,但是随着比较变得更加复杂或需要在多个地方重复使用它时,实际类可能更可取。


oldList.Sort((a, b) => a.Count.CompareTo(b.Count))在这里,我应该写什么来代替a和b? - Skuta
什么都没有 -- a和b是lambda表达式的占位符,在比较被调用时将从外部列表分配值。 - tvanfosson

3
List<List<string>> list; // filled elsewhere
list.Sort((x,y) => x.Count.CompareTo(y.Count););

1
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);

显然,您可以根据自己的情况进行调整,但这应该能够给您一个创建按另一个列表中特定字符串内元素数量排序的列表的一般想法。


1

您可以使用sort方法进行排序,通过创建自己的Compararer或给它一个类型为Comparison<T>的委托来实现。

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

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

编辑

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

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

这是按升序排序我的列表,我该如何恢复它? - Skuta
另一种(同样非常简单)反转的方法是在 lambda 箭头的一侧交换 xy,例如 (x, y) => y.Count.CompareTo(x.Count) - Jeppe Stig Nielsen

0

只需要进行一些小的调整,同时检查是否为空

        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));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接