为字典中的每个键添加值

时间:2013-04-16 22:01:59

标签: c# dictionary

我创建了一个字典,其中包含一个米号作为键,以及一个值列表。例如: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 个答案:

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

肯定有一种更有效的方法可以做到这一点,但我很确定它需要更多打字。