4

キーとしてメーター番号、値のリストを持つ辞書を作成しました。例: Meter1 のインデックス 0 の値は 45 で、インデックス 1 の値は 65 です。各メーター番号にインデックス 0 を追加する最も効率的な方法を考えていました。特定のインデックスで最大付加価値を取得しようとしています。リストは同じ長さになります。辞書を作成するために必要なコードを添付しました。

Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>();

foreach (string ertNumber in ertNumberList)
{
    if (!dictionary.ContainsKey(ertNumber))
    {
        List<string> meterReadings = new List<string>();
        meterReadings = getValuesFromOID(ertNumber);
        dictionary.Add(ertNumber, meterReadings);
    }
}
4

3 に答える 3

3

特定のインデックスで最大付加価値を取得しようとしています。

各インデックスで最大値を取得するには、これを試してください:

Dictionary<string, List<double>> dictionary = ... // NOTE: use some numeric type
Dictionary<string, double> maxima = dictionary.ToDictionary(p => p.Key, p => p.Value.Max());

これにより、ソース ディクショナリの各インデックスですべての値の最大値を格納する新しいディクショナリが生成されます。


アップデート

だからあなたはこの構造を持っています

"Meter1", [ 15, 5, 10 ]
"Meter2", [ 10, 50, 20 ]

そして、任意のインデックスでのメーターの読み取り値の合計の最大値を計算したいと考えています。それぞれが同じ長さであると仮定しましょうList<double>。私が正しく理解していれば、それは次のようになります。

Dictionary<string, List<double>> dictionary = ...
var length = dictionary.First().Value.Length;
var maximum = Enumerable.Range(0, length)
                        .Select(i => dictionary.Values.Select(d => d[i]).Sum())
                        .Max(); // 55

これが最大であるインデックスも取得したい場合は、これを使用できます。

var result =
    (from i in Enumerable.Range(0, length)
     let s = dictionary.Values.Select(d => d[i]).Sum()
     orderby s descending
     select new { Index = i, Sum = s })
    .First(); // { Index = 1, Sum = 55 }
于 2013-04-16T22:13:23.553 に答える
1

メーターの読み取り値が int に変更されたと仮定すると、LINQ を使用できます。

var maxMeterValue = dictionary[myertNumber].Max(v => v);
于 2013-04-16T22:13:00.040 に答える
0

等しくない長さのリストを処理するこれはどうですか:

var maxLength = dictionary.Values.Max(readings => readings.Count);

var sums = Enumerable.Range(0, maxLength)
    .Select(i => readings.Where(rs => i < rs.Count).Sum(rs => int.Parse(rs[i]));

var maxSum = sums.Max();

これを行うためのより効率的な方法は確かにありますが、より多くの入力が必要になると確信しています。

于 2013-04-16T23:56:00.063 に答える