如何使用linq查询带有嵌套列表的对象?

时间:2018-08-22 13:31:28

标签: c# linq linq-to-objects

我将来自第三方提供程序的JSON反序列化为一个对象,并希望查询该对象以查找特定属性中的值。

我的问题是对象具有一个属性(零件),其值是具有相同类型的列表。

@{
    var myChart = new Chart(width: 600, height: 400)
        .AddTitle("Chart Title")
        .AddSeries(
            name: "Employee",
            xValue: new[] {  "Peter", "Andrew", "Julie", "Mary", "Dave" },
            yValues: new[] { "2", "6", "4", "5", "3" })
        .Write();
}

当“零件”属性可以具有6或7个级别时,如何查询该对象以查找特定的值?

这是我收到的JSON示例:

public class RulePartModel
{
    public string isExistsUnder { get; set; }
    public int State { get; set; }       
    public string Value { get; set; }
    public List<RulePartModel> Parts { get; set; }
}

1 个答案:

答案 0 :(得分:2)

尝试一下:

        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");
相关问题