如何将匿名类型传递给C#函数并获取其值?
问题解决思路与代码示例
你的gb实际是Dictionary<<匿名类型>, List<OHLC>>,但匿名类型无法直接作为函数参数使用,同时遍历Dictionary需要处理键值对的结构,以下是两种可行方案:
方案一:用具名类替代匿名键(推荐,类型安全)
匿名类型不能跨方法传递,先定义一个专门的季度分组键类:
public class QuarterKey { public int Year { get; set; } public int Quarter { get; set; } // 必须重写Equals和GetHashCode,确保Dictionary能正确识别相同的键 public override bool Equals(object obj) { return obj is QuarterKey key && Year == key.Year && Quarter == key.Quarter; } public override int GetHashCode() { return HashCode.Combine(Year, Quarter); } }
修改分组代码,用QuarterKey替代匿名类型:
var gb = histData.GroupBy(o => new QuarterKey { Year = o.Date.Year, Quarter = ((o.Date.Month - 1) / 3) + 1 }) .ToDictionary(g => g.Key, g => g.ToList());
现在函数参数可以明确指定类型,内部遍历直接访问键和值:
private void DropIncompleteQuarters(Dictionary<QuarterKey, List<OHLC>> gb) { // 注意:遍历Dictionary时如果要删除元素,必须先转成临时列表,避免集合修改异常 foreach (var kvp in gb.ToList()) { // 获取分组的年份和季度 int year = kvp.Key.Year; int quarter = kvp.Key.Quarter; // 获取该季度的所有OHLC数据 List<OHLC> quarterData = kvp.Value; // 这里加入你的判断逻辑,比如判断季度数据是否完整 if (IsQuarterDataIncomplete(quarterData)) { gb.Remove(kvp.Key); } } }
方案二:不创建具名类,用dynamic简化(不推荐,无编译检查)
如果不想额外定义类,可将参数设为IDictionary<object, List<OHLC>>,通过dynamic访问匿名键的属性:
private void DropIncompleteQuarters(IDictionary<object, List<OHLC>> gb) { foreach (var kvp in gb.ToList()) { dynamic quarterKey = kvp.Key; int year = quarterKey.Year; int quarter = quarterKey.Quarter; List<OHLC> quarterData = kvp.Value; // 同样加入你的完整性判断逻辑 if (IsQuarterDataIncomplete(quarterData)) { gb.Remove(kvp.Key); } } }
关键注意事项
- 直接遍历Dictionary时不能修改原集合(如调用
Remove),必须用ToList()生成临时副本再遍历,否则会抛出集合修改异常。 - 方案一类型安全,便于后期维护和调试;方案二虽然快捷,但缺少编译时类型检查,容易引发运行时错误。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

