使用 linq 按对象值字段分组的其他字典中的字典

本文关键字:字典 其他 字段 linq 对象 使用 | 更新日期: 2023-09-27 18:34:44

我的程序中有一个名为TeminalDictionaryDictionary<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));

但它说我正在尝试添加具有相同键的元素,所以我有点迷茫......

问候!

使用 linq 按对象值字段分组的其他字典中的字典

您只需要在新字典中提供密钥,在您的情况下,这是组的密钥。鉴于您似乎不需要原始字典中的键,我会将其写为:

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