C#中foreach迭代GroupBy匿名类型Key时如何获取特定值
报错根因
当前用作分组Key的是C#编译生成的匿名类型,这类类型完全不支持索引器语法,没法用对象["属性名"]的方括号形式取值,这是触发编译错误的直接原因。
另外你代码里写的item3也和实际的属性名对不上:你在GroupBy里写的new { x.Item1, x.Item2, x.Item3 }是C#的投影简写,生成的匿名对象属性名和引用的源属性名完全一致,也就是Item1、Item2、Item3,根本不存在小写开头的item3属性。
修正后的可运行代码
匿名类型的属性直接用点语法访问就可以,不需要索引器,调整后的实现:
var groupedByList = firstList.Where(x => x.Cost != 0) .GroupBy(x => new { x.Item1, x.Item2, x.Item3 }); foreach (var item in groupedByList) { // 直接通过点语法取Key内的属性值 var val = item.Key.Item3; }
补充注意点
- 这种点语法访问是匿名类型的标准用法,编译期就会做类型校验,运行时没有额外开销,是这类场景下性能最好的写法。
- 如果你的业务确实需要支持“通过字符串键动态取值”的逻辑,就不要用匿名类型当分组Key,可以换成支持索引访问的结构(比如强类型自定义类、字典),但这类写法会带来额外的内存和性能损耗,非必要不要用。
内容的提问来源于stack exchange,提问作者prodigy
相关产品推荐
相关产品推荐

