C# Linq将字典聚合到新字典中

C# Linq将字典聚合到新字典中,c#,linq,C#,Linq,给定一个字典我想要一个新的字典,它是所有键上每个键的最小字典值.s的映射 我觉得这应该很容易,但我就是做不到 谢谢 澄清: class Key { string s; int i; } 希望能有所帮助。我不清楚您到底想做什么,但您可以使用从一个字典映射到另一个字典。选择(…和/或。ToDictionary(… 例如: "a" -> 12 "b" -> 11 您希望按键s属性分组,然后选择字典值中的最小值作为新字典值。我不清楚您到底想做什么,但您可以使用从一个字典映射到另一个字

给定一个
字典
我想要一个新的
字典
,它是所有键上每个键的最小字典值.s的映射

我觉得这应该很容易,但我就是做不到

谢谢

澄清:

class Key { string s; int i; }

希望能有所帮助。

我不清楚您到底想做什么,但您可以使用
从一个字典映射到另一个字典。选择(…
和/或
。ToDictionary(…

例如:

 "a" -> 12
 "b" -> 11

您希望按键
s
属性分组,然后选择字典值中的最小值作为新字典值。

我不清楚您到底想做什么,但您可以使用
从一个字典映射到另一个字典。选择(…
和/或
。ToDictionary(…

例如:

 "a" -> 12
 "b" -> 11

您希望按键
s
属性分组,然后选择字典值中的最小值作为新字典值。

一种更通用的方法来跳过由
创建的
查找
。GroupBy

var d = dict.GroupBy(kvp => kvp.Key.s).ToDictionary(g => g.Key, g => g.Min(k => k.Value));
公共静态字典聚合by(
这是一个数不清的来源,
Func键选择器,
Func值选择器,
Func聚合,
int容量=0,
IEqualityComparer比较器=空)
{
var dict=新字典(容量、比较器);
foreach(源中的var t)
{
K键=键选择器(t);
V累加器,值=值选择器(t);
if(dict.TryGetValue(键,输出累加器))
值=聚合(累加器,值);
dict[键]=值;
}
返回命令;
}
样本使用:

    public static Dictionary<K, V> aggregateBy<T, K, V>(
        this IEnumerable<T> source,
        Func<T, K> keySelector,
        Func<T, V> valueSelector,
        Func<V, V, V> aggregate,
        int capacity = 0,
        IEqualityComparer<K> comparer = null)
    {
        var dict = new Dictionary<K, V>(capacity, comparer);
        foreach (var t in source)
        {
            K key = keySelector(t);
            V accumulator, value = valueSelector(t);
            if (dict.TryGetValue(key, out accumulator))
                value = aggregate(accumulator, value);
            dict[key] = value;
        }
        return dict;
    }
var dict=newdictionary();
dict.Add(Tuple.Create(“a”,123),19);
dict.Add(Tuple.Create(“a”,456),12);
dict.Add(Tuple.Create(“a”,789),13);
dict.Add(Tuple.Create(“b”,998),99);
dict.Add(Tuple.Create(“b”,999),11);
var d=dict.aggregateBy(p=>p.Key.Item1,p=>p.Value,Math.Min);
Debug.Print(string.Join(“,”,d));/“[a,12],[b,11]”

跳过
创建的
查找
的更通用方法。GroupBy

var d = dict.GroupBy(kvp => kvp.Key.s).ToDictionary(g => g.Key, g => g.Min(k => k.Value));
公共静态字典聚合by(
这是一个数不清的来源,
Func键选择器,
Func值选择器,
Func聚合,
int容量=0,
IEqualityComparer比较器=空)
{
var dict=新字典(容量、比较器);
foreach(源中的var t)
{
K键=键选择器(t);
V累加器,值=值选择器(t);
if(dict.TryGetValue(键,输出累加器))
值=聚合(累加器,值);
dict[键]=值;
}
返回命令;
}
样本使用:

    public static Dictionary<K, V> aggregateBy<T, K, V>(
        this IEnumerable<T> source,
        Func<T, K> keySelector,
        Func<T, V> valueSelector,
        Func<V, V, V> aggregate,
        int capacity = 0,
        IEqualityComparer<K> comparer = null)
    {
        var dict = new Dictionary<K, V>(capacity, comparer);
        foreach (var t in source)
        {
            K key = keySelector(t);
            V accumulator, value = valueSelector(t);
            if (dict.TryGetValue(key, out accumulator))
                value = aggregate(accumulator, value);
            dict[key] = value;
        }
        return dict;
    }
var dict=newdictionary();
dict.Add(Tuple.Create(“a”,123),19);
dict.Add(Tuple.Create(“a”,456),12);
dict.Add(Tuple.Create(“a”,789),13);
dict.Add(Tuple.Create(“b”,998),99);
dict.Add(Tuple.Create(“b”,999),11);
var d=dict.aggregateBy(p=>p.Key.Item1,p=>p.Value,Math.Min);
Debug.Print(string.Join(“,”,d));/“[a,12],[b,11]”


我不清楚“所有键中每个键的最小字典值”是什么意思.A使用示例输入和预期输出数据将比当前形式的问题更有帮助。@JonSkeet question已更新。因此,您希望按键的
s
属性对原始词典的条目进行分组,然后在每个组中,您只对具有最小词典值的条目感兴趣;然后从所有rem中对于字典条目,您可以构建一个新的字典,其中键是原始键的
s
属性,值是原始值?看起来他希望通过聚合键的字符串部分并找到具有最大整数部分的值来获得字典的值。找到后,将字典中的值作为参考钥匙说。看horrible@stakx完全正确我不清楚“所有键中每个键的最小字典值”是什么意思.A使用示例输入和预期输出数据将比当前形式的问题更有帮助。@JonSkeet question已更新。因此,您希望按键的
s
属性对原始词典的条目进行分组,然后在每个组中,您只对具有最小词典值的条目感兴趣;然后从所有rem中对于字典条目,您可以构建一个新的字典,其中键是原始键的
s
属性,值是原始值?看起来他希望通过聚合键的字符串部分并找到具有最大整数部分的值来获得字典的值。找到后,将字典中的值作为参考钥匙说。看horrible@stakx确切地right@caesay我需要每个kvp.Key的最小kvp.Value。s@CoderBrien:好了!太棒了,非常感谢!@caesay我需要每个kvp.Key的miniumum kvp.Value。s@CoderBrien:好了!太棒了,非常感谢!我想我在这种情况下不需要它,但谢谢你指出效率低下!我不需要我不认为我需要它在这种情况下,但感谢你指出的低效!