3

タイプの辞書があります

Dictionary<int, GValue> 

ここで、GValue は 2 つの double 値 P1 と P2 を含むオブジェクトです

次のコードを使用して辞書から最大値のキーを取得しようとしています

var keyForMaxP1 = dict.Keys.Aggregate((i, j) => dict[i].P1 >= dict[j].P1 ? i : j);
var keyForMaxP2 = dict.Keys.Aggregate((i, j) => dict[i].P2 >= dict[j].P2 ? i : j);

それは私に最大 P1 と P2 のキーを正しく与えます。

しかし、辞書に最大 P1 または P2 値を持つ複数のキーが含まれている場合はどうなりますか?? ここでも、辞書のトラバース中に最初に来る 1 つのキーを返します。

編集

ディクショナリに値 P1 があり、最大値が 3.52 であるとします。ディクショナリに値 P1 = 3.52 のエントリが 2 つある場合、この値に関連する両方のキーを取得したい

4

2 に答える 2

2

すべてKeyValuPairsに最大値が必要な場合は、次を使用できますEnumerable.GroupBy

var MaxP1KeyValues = dict.GroupBy(kv => kv.Value.P1)
    .OrderByDescending(g => g.Key).First();
var MaxP2KeyValues = dict.GroupBy(kv => kv.Value.P2)
    .OrderByDescending(g => g.Key).First();

foreach (var kv in MaxP1KeyValues)
{
    Console.WriteLine("Key:{0} Value-P1:{1}", kv.Key, kv.Value.P1);
}
foreach (var kv in MaxP2KeyValues)
{
    Console.WriteLine("Key:{0} Value-P2:{1}", kv.Key, kv.Value.P2);
}

これにより、ディクショナリ内のすべてKeyValuePair<int, GValue>が P1/P2 の値でグループ化されます。 OrderByDescending+Firstは、値が最も高いグループを選択します。

于 2013-05-03T08:46:47.277 に答える
0

You could aggregate into a collection, e.g.

var keysForMaxP1 = dict.Aggregate(
                       new { Max = double.MinVal, Keys = new List<int>()},
                       (state, entry) => {
                           if (entry.Value.P1 > state.Max) {
                               state.Max = entry.Value.P1;
                               state.Keys = new List<int>() { entry.Key };
                           } else if (entry.Value.P1 == state.Max) {
                               state.Keys.Add(entry.Key);
                           }
                           return state;
                       }, state => state.Keys);

(Untested, brain-compiled code). If you're going to do something complex like this twice, though, it might be worth commonising them by using a lambda to select the P1 from the structure. (It might also be simplest to just write a loop to do this at this point rather than trying to shoe-horn this into an Aggregate - I don't expect any ORM can do anything with this other than just exectute it in C#.)

于 2013-05-03T08:54:28.130 に答える