按命名空间对列表进行排序

3
我可以帮助整理一个特定的列表。
假设有以下列表:
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

为什么radio.transmitradio.modulation.1.set之前? - TheGeneral
顺序必须按字母顺序排列,但考虑到命名空间的数量,本例中由点“.”分隔。 - tvborda
antennas.1.power 会在 antennas.A.power 之前还是之后? - TheGeneral
@tvborda 更新了我的回答。 - TheGeneral
“不太深”为什么很重要?如果您的列表中有 antennas.1,根据您的规则它将出现在错误的位置。 - Enigmativity
显示剩余3条评论
1个回答

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

完整演示请点击此处

注意:这个程序可能需要一些简单的错误检查。


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