一个跳过由.GroupBy
创建Lookup
更通用的方法:
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 = new Dictionary<Tuple<string,int>, int>();
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]"
这不是我清楚你的意思是“最小的字典值对每个键入所有键“。具有样本输入和期望输出数据的[mcve]比现有形式的问题更有帮助。 –
@JonSkeet问题已更新。 – CoderBrien
所以你想按键的's'属性来组合原始字典的条目,然后在每个组中你只对字典值最小的条目感兴趣;那么从所有剩余的字典条目中,您将创建一个新的字典,其中的密钥是原始密钥的“s”属性,并且该值是原始值? – stakx