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 回答