一個跳過由.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