代码之家  ›  专栏  ›  技术社区  ›  AT-2017

从foreach循环中获取单个值并对所有值求和

  •  0
  • AT-2017  · 技术社区  · 6 年前

    这完全是一件简单的事,而且还得坚持一段时间。这是一个场景-我有一个查询 Count 具有 Group By . 然后用 foreach 循环如下以获取单个值:

    var query = (from c in GetProducts()
                 group c by c.Type into g
                 select new
                 {
                   Type = g.Key,
                   Count = g.Count()
                 });
    
    double value = 0;
    double valTotal = 0;
    
    double finalResult = 0;
    
    foreach (var item in query)
    {
       value = (((Convert.ToDouble(item.Count)) / 10) * 100); //Getting the count from the above query and this gets individual result set, say grouping category
       valTotal += value; //Trying to do the total of the 'value' result set and this doesn't return the appropriate sum
    
       finalResult = ((value / valTotal) * 100); Then trying to divide the individual values with the total in the end to get values in percentage
    }
    

    示例:从foreach循环获取值,在value变量中,我得到-10、20、30、40。然后将它们全部(10+20+30+40)=100,最后再将单个结果集(10/100)*100;(20/100)*100等相加。我期待着用一种简单的方式来做,但似乎遗漏了一些东西。任何建议都将不胜感激。

    注释 : finalResult 变量应该像这样最终返回单个结果集(10/100)*100=10%;(20/100)*100=20%。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Henk Holterman    6 年前

    列一个组列表,因为我们需要它两次:

    var query = (from ...).ToList();
    

    然后百分比列表是

    decimal sum = query.Sum(g => g.Count);
    var percentages = query
        .Select(g => (g.Count / sum) * 100)  // cast to double/decimal/int as required
        .ToList()
        ;
    

    请注意,这将加起来非常接近100%,但可能会有一点。


    另外,假设type==category

    .Select(g => new {
        Category = g.Key,
        Average = (g.Count / sum) * 100  // cast to double/decimal/int as required
       })