首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按名称空间对列表进行排序

按名称空间对列表进行排序
EN

Stack Overflow用户
提问于 2018-04-24 08:31:33
回答 1查看 105关注 0票数 3

我想要一些帮助排序一个特定的列表。

想象一下下面的列表:

代码语言:javascript
复制
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()函数,它将如下所示:

代码语言:javascript
复制
antennas.1.power
antennas.2.power
antennas.found
antennas.ports
antennas.sequence
radio.frequency
radio.modulation.1.set
radio.modulation.2.set
radio.transmit

但我正在寻找一种将尊重名称空间数量的排序,因此深度较小的项应该放在彼此的顶部。对于上面的例子,我希望列表是这样排序的:

代码语言:javascript
复制
antennas.found
antennas.ports
antennas.sequence
antennas.1.power
antennas.2.power
radio.frequency
radio.transmit
radio.modulation.1.set
radio.modulation.2.set
EN

回答 1

Stack Overflow用户

发布于 2018-04-24 10:23:11

我相信有一种更优雅的方式可以做到这一点,但是...

给定的扩展

代码语言:javascript
复制
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();
}

使用

代码语言:javascript
复制
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();

输出

代码语言:javascript
复制
antennas.found
antennas.ports
antennas.sequence
antennas.1.power
antennas.2.power
radio.frequency
radio.transmit
radio.modulation.1.set
radio.modulation.2.set

备注:它可能可以使用一些简单的错误检查

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49991743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档