.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