【问题标题】:How to get the sum of List object property values using foreach如何使用 foreach 获取 List 对象属性值的总和
【发布时间】:2014-07-16 11:59:46
【问题描述】:

我想要做什么

找出购物车列表中所有商品的价格总和。

我是如何解决的

我认为将其作为属性添加到 Cart 类中是有意义的。 我还认为只使用 foreach 循环来迭代 CartList 并将 itemprice (ProductsInCart.Price) 添加到临时变量 (PriceSum) 是合乎逻辑的,该变量在“Cart.PriceAllContent”属性中返回。

C#

//Instantiating Cart
  Cart C2Cart = new Cart();

//Getting Item in cart from Session
  C2Cart.TakeCart();

//Writing out result
  Response.Write(C2Cart.PriceAllContent);

public class Cart
{
    //FIELDS    
    private List<ProductsInCart> _cartList;
    
    //PROPERTIES
    public List<ProductsInCart> CartList
    {
        get { return _cartList; }
        set { _cartList = value; }
    }


    public float PriceAllContent
    {
        get
        {
            float PriceSum= 0;
            foreach (var ProductsInCart in _cartList)
            {
                PriceSum= +ProductsInCart.Price;
            }
            return PriceSum;
        }
    }

  ...........
}

public class ProductsInCart
{
    //FIELDS
    private int _id;
    private string _name;
    private float _price;
    private int _amount;

............
}

完整的类代码可以看这里(可能还没有完全更新。如果需要请询问) https://github.com/chmodder/PlanteskoleWebsite/tree/master/App_Code

问题

问题是,当写出结果时,它只会写出最后一个项目的价格,而不是所有项目价格的总和。

Response.Write(C2Cart.PriceAllContent);

我已经尝试过寻找解决方案,但找不到我需要的东西。 如果有人能帮我解决问题,我会是一个快乐的人。

【问题讨论】:

  • PriceSum= +ProductsInCart.Price -> PriceSum += ProductsInCart.Price... 你在做PriceSum = (+1 * ProductsInCart.Price)。您可以通过放置断点、单步执行代码和检查变量来发现此类问题。

标签: c# list oop foreach


【解决方案1】:

如果您想将PriceSum 变量与产品价格一起增加,请使用+= operator

foreach (var ProductsInCart in _cartList)
{
    PriceSum += ProductsInCart.Price; // instead of =+
}

当您编写= +value 时,它的两个单独的运算符= operator+ operator+ProductsInCart.Price 只返回产品的价值,价格,然后您将此值分配给PriceSum。结果,您将获得列表中最后一个产品的价格。

您也可以使用 LINQ 代替此循环:

public float PriceAllContent
{
    get { return _cartList.Sum(p => p.Price); }
}

【讨论】:

  • 那很快 :) 现在就试试
  • 为了避免混淆,PriceSum = PriceSum + ProductsInCart.Price;
  • 这样一个愚蠢的小错误,让我沮丧了好几个小时。这几乎令人尴尬,但我很高兴地告诉你,它现在可以工作了:) 谢谢。大约 10 分钟后,我会在网站允许时勾选您的答案。
  • 就像我在评论中所说的那样,这不应该花费你几个小时。 Visual Studio 拥有最好的调试器之一。使用断点并检查您的变量。
  • @lucuma += 如果是非常方便的操作符,我认为它不会让你感到困惑,习惯就好:)
【解决方案2】:

=+ 应该是 += 来解决您的问题。

你也可以简化:

public float PriceAllContent
{
    get { return _cartList.Sum(i => i.Price); }
}

尽管按照惯例,我会使用方法CalculatePriceAllContent() 而不是属性,以向调用者表明您正在进行计算,而不仅仅是获取存储值。见https://stackoverflow.com/a/601648/1094268

【讨论】:

  • 求和运算并不复杂,也不会产生副作用。
  • @CodeCaster 这取决于复杂的含义。它实际上做了一些计算,这就是我的观点。如果列表中有数百万个对象怎么办?这是O(n),而不是我希望的属性O(1)
  • 我想我会等到我学会了 LINQ。无论如何谢谢:)
【解决方案3】:
        int sum1;
        List<int> num = new List<int>() {1,2,3,4,5 };
        sum1 = num.Sum();
        Console.WriteLine(sum1);

【讨论】:

    猜你喜欢
    • 2021-09-29
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多