使用 linq 按对象值字段分组的其他字典中的字典
本文关键字:字典 其他 字段 linq 对象 使用 | 更新日期: 2023-09-27 18:34:44
我的程序中有一个名为TeminalDictionary
的Dictionary<ulong,Terminal>
,其中Terminal
有下一个道具:
public class Terminal
{
public string TAC { get; set; }
public string Name { get; set; }
public string Model { get; set; }
public string OS { get; set; }
public string Manufacturer { get; set; }
public uint Freq { get; set; }
}
因此,对于该字典,我想制作另一个字典,Dictionary<string,ulong>
每个制造商的所有频率相加,因此字典键Terminal.Manufacturer
并且值与同一制造商Sum(Terminal.Freq)
。
我试过这个表达方式:
var pieDictionary = TerminalDictionary
.GroupBy(x => x.Value.Manufacturer)
.ToDictionary(g => g.Sum(v => v.Value.Freq));
但它说我正在尝试添加具有相同键的元素,所以我有点迷茫......
问候!
您只需要在新字典中提供密钥,在您的情况下,这是组的密钥。鉴于您似乎不需要原始字典中的键,我会将其写为:
var pieDictionary = TerminalDictionary.Values
.GroupBy(x => x.Manufacturer)
.ToDictionary(g => g.Key, g => g.Sum(v => v.Freq));
我可以建议你一个不同的方法吗?您可以使用Lookup<tkey,tval>
:
var manufacturerFreqs = TeminalDictionary.Values
.ToLookup(t => t.Manufacturer, t => (int)t.Freq);
int freq = manufacturerFreqs["Manufacturername"].Sum();
查找类似于字典并且同样高效,但它允许"重复"键,因为该值是IEnumerable<TVal>
,因此您可以查询它。
因此,可以将整个对象存储为元素并获取Freq
的总和:
var manufacturerTerminals = TeminalDictionary.Values.ToLookup(t => t.Manufacturer);
int freq = manufacturerTerminals["Manufacturername"].Sum(t => (int)t.Freq);
这使得这个集合更加灵活、可重用和强大。
MSDN:
Lookup<TKey, TElement>
类似于Dictionary<TKey, TValue>
。这 不同之处在于Dictionary<TKey, TValue>
将键映射到单个 值,而Lookup<TKey, TElement>
将键映射到 值。您可以通过以下方式创建查找实例 在实现IEnumerable<T>
的对象上调用ToLookup
。