Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将此命名空间列表格式化为无重复项的结构化对象?_C#_Data Structures - Fatal编程技术网

C# 如何将此命名空间列表格式化为无重复项的结构化对象?

C# 如何将此命名空间列表格式化为无重复项的结构化对象?,c#,data-structures,C#,Data Structures,所以我有一个包含这个名称空间属性的对象列表。我尝试将列表分组为一个不包含重复项的对象,其结构如下: Core Util Log Fetch Math Add Subtract [ { Namespace: "Core.Util", Name: "Log" }, { Namespace: "Core.Util", Name: "Fetch" }, { Namespace: "C

所以我有一个包含这个名称空间属性的对象列表。我尝试将列表分组为一个不包含重复项的对象,其结构如下:

Core
   Util
      Log
      Fetch
   Math
      Add
      Subtract
[
  {
    Namespace: "Core.Util",
    Name: "Log"
  },
  {
    Namespace: "Core.Util",
    Name: "Fetch"
  },
  {
    Namespace: "Core.Math",
    Name: "Add"
  },
  {
    Namespace: "Core.Math",
    Name: "Subtract"
  }
]
输入列表如下所示:

Core
   Util
      Log
      Fetch
   Math
      Add
      Subtract
[
  {
    Namespace: "Core.Util",
    Name: "Log"
  },
  {
    Namespace: "Core.Util",
    Name: "Fetch"
  },
  {
    Namespace: "Core.Math",
    Name: "Add"
  },
  {
    Namespace: "Core.Math",
    Name: "Subtract"
  }
]

假设您正在使用JSON.Net将JSON解析为对象,您可以使用Linq根据其“Namespace”属性对其进行分组:

 var results = jsonObjects.GroupBy(o => new { Core = o.Namespace.Split('.')[0], Sub = o.Namespace.Split('.')[1] });
这将为您提供两个组(Core.Util和Core.Math),每个组有2个条目。
我不知道“无重复项”的确切含义,但我建议您看看LINQ Distinct()-运算符。

您要做的是将对象的平面列表转换为节点的递归层次结构,其中每个节点在其父节点的上下文中由某个唯一的名称指定。您已经标记了您的问题,因此您正在寻找一个数据模型,该模型将使构建这样的层次结构变得容易

概括一下,每个节点应如下所示:

public abstract partial class HierarchicalNode<TItem, THierarchicalNode>
    where THierarchicalNode : HierarchicalNode<TItem, THierarchicalNode>, new()
{
    public IDictionary<string, THierarchicalNode> Children { get; private set; }

    public ICollection<TItem> Items { get; private set; }

    public HierarchicalNode()
    {
        this.Children = new Dictionary<string, THierarchicalNode>();
        this.Items = new List<TItem>();
    }
}
这里的相关方法是
AddObject(IList nodeNames,TItem item)
,它添加了一个位于由名称列表指定的嵌套节点列表中的对象

最后,由于您对名称空间感兴趣,您可以按如下方式定义您的特定类型:

public class Namespace : HierarchicalNode<string, Namespace>
{
}
// Deserialize the JSON shown in the question to an array of objects with Namespace and Name properties
var list = JsonConvert.DeserializeAnonymousType(
    jsonString, 
    new[] { new { Namespace = default(string), Name = default(string) } });

var root = new Namespace();
foreach (var item in list)
{
    // Split the Namespace property into an array for recursive processing
    root.AddObject(item.Namespace.Split('.'), item.Name);
}

演示小提琴。

是的,顶部是我想要的,底部是提供的数据。抱歉搞砸了你想要这样的吗?