c# - 按 namespace 对列表进行排序

标签 c# list sorting

我需要一些帮助来对特定列表进行排序。

想象一下下面的列表:

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

最佳答案

我确信有更优雅的方法来做到这一点,但是......

给定的扩展

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

Full Demo Here

Note : It can probably do with some simple error checking

关于c# - 按 namespace 对列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49991743/

相关文章:

python - 获取中位数两侧的两个数字

python - 如何为 Python 列表切片返回任何内容

java - 洋葱架构 : Should UI project have access to Domain Layer?

c# - 使用 BasicHttpBinding 进行身份验证的 WCF 服务

c# - 如何将带有错误规范(无效用户名或无效密码)的 HttpResponseException 返回给前端?

统计List的Size,有必要用free()吗?

c++ - 按一个字段对自定义对象的 vector 进行排序

php - php或/和mysql中的多重排序不生效

algorithm - 排序列表,使相等元素之间的差距尽可能大

c# - Dataset.WriteXml() 命名空间和前缀