迭代对象列表并将所有对象的一个​​索引获取为Total

时间:2016-10-20 17:27:43

标签: c# loops foreach

我需要创建一个循环,遍历列表中的所有对象并提取特定索引的值并返回具有总量的Int。 我将尽可能地尽力解释。

public class CostEachActivity
{
    public string activityID { get; set; }
    public int accountNr { get; set; }       
    public int amount { get; set; }
}

这是我的类,列表包含来自的对象。 我将发送一串activityID,我必须从所有帐户返回总费用。

这是包含所有对象的列表(计数为5个大气压)

List<CostEachActivity> dka = new List<CostEachActivity>();

编辑:这是工作方法。

   int sum = 0;
List<CostEachActivity> templist = new List<CostEachActivity>();           
 foreach (CostEachActivity cea in dka)
 {
   if (cea.activityID == activityID)
       templist.Add(cea);
  }

foreach(var item in tempList)
 {
    sum += item.Amount;
 }

3 个答案:

答案 0 :(得分:1)

如果我做对了你可以做类似的事情:

public int GetSum(string activityId)
{
    return dka.Where(cea => cea.activityId == activityId).Sum(cea => cea.amount)
}

或者使用新的C#6.0 Expression-bodied函数成员:

public int GetSome(string activityId) => 
    dka.Where(cea => cea.activityId == activityId)
    .Sum(cea => cea.amount);

答案 1 :(得分:1)

  

问题

除了不编译之外,你的内循环应该在主循环之外。找到你想要加总的所有项目后(或以不同的方式找到匹配的项目时已经加总。

此外,看到您在{}之后打开if并嵌套了第二个foreach - 该范围适用于每个项目。您if语句,如果返回true将执行tempList的添加,那么,无论if发生什么,第二个foreach都会发生

if (cea.activityID == activityID)  // If this is true
    templist.Add(cea);             // Then this executes

{                                 // And this happens in any case
    foreach (cea.amount = sum + amount)
}
  

可能的解决方案

  1. 按照您开始的方式进行:

    int sum = 0;
    List<CostEachActivity> templist = new List<CostEachActivity>();           
    foreach (CostEachActivity cea in dka)
    {
        if (cea.activityID == activityID)
            templist.Add(cea);
    }
    
    foreach(var item in tempList)
    {
        sum += item.Amount;
    }
    
  2. 随时对值求和:

    int sum = 0;
    foreach (CostEachActivity cea in dka)
    {
        if (cea.activityID == activityID)
            sum += cea.Amount;
    }
    
  3. IMO最好的方法:使用linq你可以这样做:

    var sum = dka.Where(item => item.activityID == activityID)
                 .Sum(item => item.amount);
    

答案 2 :(得分:1)

使用Linq

public int GetSum(string activityID)
{
    return dka.Where(d => d.activityID == activityID).Sum(d => d.amount);
}