For [my blazor library](https://github.com/Joelius300/ChartJSBlazor) which is a modification of [this awesome library](https://github.com/mariusmuntean/ChartJs.Blazor) I have to convert an `ExpandoObject` into a `Dictionary<string, object>` since `ExpandoObject`s aren't serialized properly in the newest preview versions of dotnet-core. See [my question related to this](https://stackoverflow.com/questions/56693103/invoke-javascript-method-from-c-sharp-with-dynamic-parameter) for more details.

My current approach goes as follows: 
```
Dictionary<string, object> ConvertDynamicToDictonary(IDictionary<string, object> value)
{
 return value.ToDictionary(
 p => p.Key,
 p =>
 {
 // if it's another IDict (might be a ExpandoObject or could also be an actual Dict containing ExpandoObjects) just go through it recursively
 if (p.Value is IDictionary<string, object> dict)
 {
 return ConvertDynamicToDictonary(dict);
 }

 // if it's an IEnumerable, it might have ExpandoObjects inside, so check for that
 if (p.Value is IEnumerable<object> list)
 {
 if (list.Any(o => o is ExpandoObject))
 {
 // if it does contain ExpandoObjects, take all of those and also go through them recursively
 return list
 .Where(o => o is ExpandoObject)
 .Select(o => ConvertDynamicToDictonary((ExpandoObject)o));
 }
 }

 // neither an IDict nor an IEnumerable -> it's probably fine to just return the value it has
 return p.Value;
 } 
 );
}
```
This works fine but I'm not sure about the `IEnumerable` part. If I omit the `list.Any` check it still works fine. New version (only write the `IEnumerable` part changed):

```
// if it's an IEnumerable, it might have ExpandoObjects inside, so check for that
if (p.Value is IEnumerable<object> list)
{
 // take all ExpandoObjects and go through them recursively
 return list
 .Where(o => o is ExpandoObject)
 .Select(o => ConvertDynamicToDictonary((ExpandoObject)o));
}
```

I have also tried using `IEnumerable<ExpandoObject>` instead of just `IEnumerable<object>` to see if that would work and maybe be cleaner and I can confirm that that does **not** work (throws error). 


What I would like to know now is, if it's a good idea to omit the `Any` check and which option is more performant (and why) and/or cleaner. 
Also please mention every small thing that bugs you, I always want to make it as perfect as possible :) 

I first wanted to post this on StackOverflow but I think it fits better on here - correct me if I'm wrong.