我将来自第三方提供程序的 JSON 反序列化为一个对象,并希望查询该对象以查找特定属性中的值。
我的问题是该对象有一个属性 (Parts),其值是一个具有相同类型的列表。
public class RulePartModel
{
public string isExistsUnder { get; set; }
public int State { get; set; }
public string Value { get; set; }
public List<RulePartModel> Parts { get; set; }
}
当 Parts 属性可以有 6 或 7 级时,如何查询此对象以查找特定值?
这是我作为答案收到的 JSON 示例:
{
"isExistsUnder": null,
"State": "",
"Value": "CustomElements",
"Parts": [
{
"isExistsUnder": null,
"State": 0,
"Value": "Rule 73",
"Parts": [
{
"isExistsUnder": null,
"State": "",
"Value": "For variable initializations",
"Parts": [
{
"isExistsUnder": null,
"State": "",
"Value": "cupis",
"Parts": [
{
"isExistsUnder": null,
"State":"",
"Value": "randomText1",
"Parts": []
},
{
"isExistsUnder": null,
"State":"",
"Value": "randomText2",
"Parts": []
},
{
"isExistsUnder": null,
"State":"",
"Value": "randomText3",
"Parts": []
}
]
}
}
}
}
试试这个:
static void Main(string[] args)
{
var testobj = new RulePartModel();
var results = FindParts(testobj, q => q.Value == "123");
// results =>>> all objects with your condition
}
static IEnumerable<RulePartModel> FindParts(RulePartModel obj, Func<RulePartModel, bool> predicate)
{
if (predicate.Invoke(obj))
yield return obj;
foreach (var item in obj.Parts)
foreach (var res in FindParts(item, predicate))
yield return res;
}
或对非递归函数使用@Parrish建议:
static IEnumerable<RulePartModel> FindParts(RulePartModel obj)
{
var stack = new Stack<RulePartModel>();
stack.Push(obj);
while (stack.Count > 0)
{
var current = stack.Pop();
yield return current;
foreach (var item in current.Parts)
stack.Push(item);
}
}
用法示例:
var results = FindParts(testobj).Where(q => q.Value == "123");
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句