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);
}
演示小提琴。是的,顶部是我想要的,底部是提供的数据。抱歉搞砸了你想要这样的吗?