我创建了一个字典,其中包含一个米号作为键,以及一个值列表。例如: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);
}
}
答案 0 :(得分: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
如果您还想获得 index ,那么这是最大值,您可以使用它:
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 }
答案 1 :(得分:1)
假设仪表读数已更改为int,则可以使用LINQ:
var maxMeterValue = dictionary[myertNumber].Max(v => v);
答案 2 :(得分: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();
肯定有一种更有效的方法可以做到这一点,但我很确定它需要更多打字。