在C#中对嵌套字符串列表进行排序

时间:2015-09-13 06:50:16

标签: c# sorting

我想要实现的是按字母顺序排序的嵌套列表。

E.g。我的意见:

fat, twat, gat    //Line 1
cat, hat, bat     // Line 2
twat, lack, rat   // Line 3

我希望输出为:

bat, cat, hat    // Line 2
fat, gat, twat   // Line 1
lack, rat, twat  // Line 3

如您所见,列表首先在内部排序,然后在外部排序。

我目前的实施是使用嵌套列表:

List<List<String>> testSort;

我已设法使用此方法对内部列表进行排序:

    public static List<List<String>> sortList(List<List<String>> input)
    {
        input.ForEach(delegate (List<string> o)
        {
            o.Sort();
        });

        return input;
    }

我现在不确定如何对外面的列表进行排序。帮助将不胜感激!

提前致谢!

4 个答案:

答案 0 :(得分:8)

在每个内部列表已经排序后,您可以使用OrderBy()根据每个列表的第一个元素对外部列表进行排序:

input.ForEach(t => t.Sort());
input = input.OrderBy(t => t.First()).ToList();

为了回应下面的M.kazem Akhgary评论,如果你想要对外部列表进行排序,我不仅要考虑这个解决方案,不仅要基于第一个元素而且要整个列表。也许其他人有更好的解决方案。

input.ForEach(t => t.Sort());
input.Sort((e1, e2) => {
    for (int i = 0; i < e1.Count; i++)
    {
        if(e1[i] != e2[i])
        {
            return e1[i].CompareTo(e2[i]);
        }
    }

    return 0;
});

答案 1 :(得分:4)

由于sortList的签名具有返回类型,因此最好不要修改input列表的内容 - 这可能会导致副作用和错误代码。

以下我将如何解决这个问题:

public static List<List<String>> sortList(List<List<String>> input)
{
    return input
        .Select(x => x.OrderBy(y => y).ToList())
        .OrderBy(x => String.Join(", ", x))
        .ToList();
}

所以,鉴于此输入:

var input = new List<List<string>>()
{
    new List<string>() { "fat", "twat", "gat", },
    new List<string>() { "cat", "hat", "bat", },
    new List<string>() { "twat", "lack", "rat", },
};

这将是输出:

output

答案 2 :(得分:2)

  

我不确定如何在外面对列表进行排序。

假设您已对所有内部子列表进行了排序,现在可以:

constraints.setCountLimit

这会将子列表连接到单个字符串以进行比较,这样如果第一个元素相同,它将比较列表的第二个元素。第三,如果第二个元素是相同的......

使用input = input.OrderBy(subList => String.Join(",", subList)).ToList(); 时应该有一个分隔符,以避免在比较第一个元素时意外使用第二个元素。分隔符不应出现在原始字符串中。

答案 3 :(得分:2)

您可以实现自己的List比较器。不使用Linq

private static void Main()
{
    List<List<string>> list = new List<List<string>>
    {
        new List<string> {"fat", "twat", "gat"},
        new List<string> {"cat", "hat", "bat"},
        new List<string> {"twat", "lack", "rat"}
    };

    // sort the inner list
    foreach (var l in list)
    {
        l.Sort();
    }

    list.Sort(new ListComparer<string>()); // sort outer list according to ListComparer class.
}

这是List Comparer。

class ListComparer<T> : Comparer<List<T>> where T : IComparable
{
    // Compare lists elements until they are no more equal.
    // return result of last compared elements as result.
    public override int Compare(List<T> x, List<T> y)
    {
        int compared = 0;
        for (int i = 0; compared == 0 && i < x.Count && i < y.Count ; i++)
        {
            compared = x[i].CompareTo(y[i]);
        }
        return compared;
    }
}

方法Compare返回一个整数,指示第一个列表是大(1)还是第二个(-1)。如果两个列表都相等,它将返回0

Sort方法使用此结果来整理您的列表。