我想要实现的是按字母顺序排序的嵌套列表。
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;
}
我现在不确定如何对外面的列表进行排序。帮助将不胜感激!
提前致谢!
答案 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", },
};
这将是输出:
答案 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
方法使用此结果来整理您的列表。