如何用RowId作为字典键转换集合,且值中不包含RowId?
解决方案
当然可以!你完全不需要把RowId包含在最终的匿名对象里,只需要利用ToDictionary的重载版本就能搞定——这个版本允许你分别指定字典的键选择器和要存入字典的值选择器,完美适配你的需求。
修改后的代码如下:
var jsonString = JsonConvert.SerializeObject( this.DocumentTypes.ToDictionary( c => c.RowId, // 指定字典的键为RowId c => new { c.Id, c.IsDocumentType } // 指定字典的值为只包含Id和IsDocumentType的匿名对象 ) );
原理说明
你原来的写法是先通过Select投影出包含RowId的匿名对象,再基于这个对象的RowId字段生成字典。而直接使用ToDictionary的双参数重载,相当于把“选键”和“选值”的操作合并成一步:
- 第一个参数
c => c.RowId告诉LINQ用每个DocumentTypes元素的RowId作为字典的键; - 第二个参数
c => new { c.Id, c.IsDocumentType }直接生成不含RowId的匿名对象作为对应的值。
这样生成的字典结构和你原来的完全一致——键依然是RowId,但字典的值里不再包含RowId字段,完全满足你的要求。
内容的提问来源于stack exchange,提问作者Thierry
相关产品推荐
相关产品推荐

