C#:在这种情况下,我将如何筛选出不需要的命名空间

本文关键字:筛选 不需要 命名空间 何筛选 这种情况下 | 更新日期: 2023-09-27 18:33:39

这更像是一个与语言无关的问题,而不是特定于 C# 的问题,但由于它涉及命名空间,我想我会将其标记为 .网络相关。

假设你有一堆表示命名空间的字符串:

[
    "System",
    "System.Windows",
    "System.Windows.Input",
    "System.Windows.Converters",
    "System.Windows.Markup",
    "System.Windows.Markup.Primitives",
    "System.IO",
    "System.IO.Packaging"
]

您希望以这样一种方式筛选它们,即排除集合中"包含"另一个命名空间的任何命名空间。例如,由于System包含System.Windows,因此将其排除在外。由于System.IOSystem.IO.Packaging的父母,所以同样被排除在外。这一直持续到您最终得到以下结果:

[
    "System.Windows.Input",
    "System.Windows.Converters",
    "System.Windows.Markup.Primitives",
    "System.IO.Packaging"
]

在 C# 中以这种方式筛选列表的有效方法是什么?我正在寻找一种看起来像这样的方法:

public IEnumerable<string> FilterNamespaces(IEnumerable<string> namespaces) {}

任何帮助将不胜感激,谢谢!


编辑:这是最终对我有用的:

public IEnumerable<string> FilterNamespaces(IEnumerable<string> namespaces) =>
    namespaces.Where(current => !namespaces.Any(n => n.StartsWith($"{current}.")));

C#:在这种情况下,我将如何筛选出不需要的命名空间

您可以构建一棵树,其中根是System命名空间,每条边将表示不同命名空间之间的父子关系。然后,您可以使用遍历算法找到树的所有叶子,该算法查找每个节点的秩(rank=1 的节点是叶子 - 它们没有子节点)。

尝试关注

 public static IEnumerable<string> FilterNamespaces(IEnumerable<string> namespaces)
 => namespaces
  .Where(ns => namespaces
    .Where(n => n != ns)
      .All(n => !Regex.IsMatch(n, $@"{Regex.Escape(ns)}['.'n]")))
  .Distinct();