Search code examples
c#dynamicgroupinganonymous-types

How to pass an anonymous type to a function, then get the values


I have a function like this:

private void DropIncompleteQuarters(//what goes in here? This? IEnumerable<dynamic> gb)
{
    foreach(var groupInGb in gb)
    {
        // What goes in here to get each element?
    }
}

I am generating a Grouping like this:

histData = new List<OHLC>();

var gb = histData.GroupBy(o => new
{
    Year = o.Date.Year,
    Quarter = ((o.Date.Month - 1) / 3) + 1
})
.ToDictionary(g => g.Key, g => g.ToList());

I would like to pass gb to DropIncompleteQuarters, but I am not sure what the type should be.

Then inside of DropIncompleteQuarters, I would like to iterate over the items?


Solution

  • I suggest using named tuple instead of anonymous type. With a slight syntax change - (...) instead of {...} you can put

    private void DropIncompleteQuarters(Dictionary<(int Year, int Quarter), 
                                                   List<OHLC>> gb)
    {
        foreach (var pair in gb)
        {
            // Let's deconstruct pair.Key 
            var (year, quarter) = pair.Key; 
            var list = pair.Value;
    
            //TODO: some logic for year and quarter and list
        }
    }
    
    histData = new List<OHLC>();
    
    var gb = histData
       .GroupBy(o => ( // change { .. } to ( .. ) and `=` to `:`
          Year    : o.Date.Year,
          Quarter : ((o.Date.Month - 1) / 3) + 1
       ))
       .ToDictionary(g => g.Key, g => g.ToList());