我想帮助排序特定列表。
想象一下以下列表:
antennas.sequence
antennas.ports
antennas.1.power
antennas.2.power
antennas.found
radio.modulation.1.set
radio.modulation.2.set
radio.transmit
radio.frequency
如果我们应用简单的List.Sort()函数,它将变为如下:
antennas.1.power
antennas.2.power
antennas.found
antennas.ports
antennas.sequence
radio.frequency
radio.modulation.1.set
radio.modulation.2.set
radio.transmit
但我正在寻找一种能够尊重命名空间数量的排序,因此深度较小的项目应该相互重叠。对于上面的例子,我希望列表的排序方式如下:
antennas.found
antennas.ports
antennas.sequence
antennas.1.power
antennas.2.power
radio.frequency
radio.transmit
radio.modulation.1.set
radio.modulation.2.set
答案 0 :(得分:3)
我确信有一种更优雅的方式可以做到这一点,但是......
给定扩展程序
public static IOrderedEnumerable<string[]> RecusiveCustomOrderBy(this IOrderedEnumerable<string[]> list,int maxDepth, int depth = 1)
{
if (depth >= maxDepth)
return list;
return list.ThenBy(x => x.Length <= depth ? null : x[depth])
.ThenBy(x => x.Length)
.RecusiveCustomOrderBy(maxDepth, depth + 1);
}
public static List<string> NamespaceOrderBy(this List<string> list)
{
var split = list.Select(x => x.Split('.')).ToList();
var maxDepth = split.Max(x => x.Length);
return split.OrderBy(x => x[0])
.ThenBy(x => x.Length)
.RecusiveCustomOrderBy(maxDepth)
.Select(x => string.Join(".", x))
.ToList();
}
<强>用法强>
var list = new List<string>
{
"antennas.sequence",
"antennas.ports",
"antennas.1.power",
"antennas.2.power",
"antennas.found",
"radio.modulation.1.set",
"radio.modulation.2.set",
"radio.transmit",
"radio.frequency"
};
var results = list.NamespaceOrderBy();
<强>输出强>
antennas.found
antennas.ports
antennas.sequence
antennas.1.power
antennas.2.power
radio.frequency
radio.transmit
radio.modulation.1.set
radio.modulation.2.set
注意:它可以用于一些简单的错误检查