Hoe LINQ te gebruiken met dynamische collecties

Is er een manier om dynamicobject te converteren naar IEnumerableType om collectie te filteren met eigenschap.

dynamic data = JsonConvert.DeserializeObject(response.Content);

Ik moet zoiets als dit openen

var a = data.Where(p => p.verified == true)

Ideeën?


Antwoord 1, autoriteit 100%

Zolang dataeen soort IEnumerableis, kun je het volgende gebruiken:

var a = ((IEnumerable) data).Cast<dynamic>()
                            .Where(p => p.verified);

De Cast<dynamic>()moet eindigen met een IEnumerable<dynamic>zodat het type parameter voor de lambda-expressie ook dynamic.


Antwoord 2, autoriteit 43%

Probeer te casten naar IEnumerable<dynamic>

((IEnumerable<dynamic>)data).Where(d => d.Id == 1);

Deze aanpak is 4x sneller dan andere benaderingen.

veel succes


Antwoord 3

Als je kunt, is de ideale oplossing om het type op te geven bij het deserialiseren, zodat je later niet hoeft te casten. Dit is een stuk schoner dan de hierboven voorgestelde benaderingen.

Dus als je –

dynamic data = JsonConvert.DeserializeObject(response.Content);

Verander dit dan gewoon in –

var data = JsonConvert.DeserializeObject<IEnumerable<dynamic>>(response.Content);

Antwoord 4

Dit kan helpen, vervang jsonString door response.Content en gebruik geneste lussen indien nodig op basis van uw reactie-inhoud.

In de onderstaande code zal JValue.Parse JToken retourneren, wat IEnumerable is

       string jsonString = "[{\"Question\":{\"QuestionId\":49,\"QuestionText\":\"Whats your name?\",\"Answer\":\"xyz\"}},{\"Question\":{\"QuestionId\":51,\"QuestionText\":\"Are you smart?\",\"Answer\":\"Yes\"}}]";
        dynamic myObject = JValue.Parse(jsonString);
        foreach (dynamic questions in myObject)
        {
            Console.WriteLine(questions.Question.QuestionId + "." + questions.Question.QuestionText.ToString());
            Console.WriteLine("Ans. " +questions.Question.Answer);
            Console.WriteLine();
        }
        Console.Read();

Other episodes