字典中每个键的值添加价值

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);
    }
}

3
这些“meterReadings”是数字吗?为什么要将它们存储为字符串? - p.s.w.g
它们是数字,我需要改变它! - user2262787
看起来 getValuesFromOID 可能调用了某种数据库查询或接口,返回原始数据。如果你返回一个有意义的领域模型对象,具有正确的数据类型和有意义的字段名称,而不是一个没有上下文的混合数据的字符串列表,那么这将有助于你和你的代码的可维护性。 - mellamokb
如果值只是一个或多个数字值,为什么要使用 List<string> 作为值呢? - Chibueze Opata
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
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 }

这非常接近!这让我得到了每个列表的最大值,但我正在寻找将列表相加(仅按索引)然后找到添加值的最大值。例如:Meter1:(0,15),(1,5)(2,10)Meter2:(0,10),(1,50)(2,20)结果:(25)(55)(30),添加的最大值为55。0、1、2仅是索引。抱歉我表述含糊,今天很长。 - user2262787

1
假设表读数被更改为整数,您可以使用LINQ:
var maxMeterValue = dictionary[myertNumber].Max(v => v);

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();

肯定有更有效率的方法来做这件事,但我相信那需要更多的打字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,