2010-06-01 32 views
1

问题:我正在尝试更新列表。如果某个项目的ID已经存在于列表中,我想添加到该项目的数量。如果没有,那么我想添加另一个项目到列表中。C#StackOverflowException

  cart = (List<OrderItem>)Session["cart"]; 

      for(int counter = cart.Count-1; counter >= 0; counter--) 
      { 
       if (cart[counter].productId == item.productId) 
       { 
        cart[counter].productQuantity += item.productQuantity; 
       } 
       else if (counter == 0) 
       { 
        cart.Add(item); 
       } 
      } 

cart[counter]item表示我的一个自定义对象的一个​​实例(或多个)。目前,当我终于找到一个匹配的ID时,所有东西都像应该工作一样,但是我得到了抛出在我的自定义对象类中的StackOverflowException。

public int productQuantity 
    { 
     get 
     { 
      return _productQuantity; 
     } 
     set 
     { 
      productQuantity = value; 
     } 
    } 

它被扔到“set”的开括号处。请问有人能告诉我什么是错误的,因为我在过去的两个半小时内一直没有结果。先谢谢你。

+1

在一个侧面说明,词典或HashSet的可能更好地为你;在这种情况下不需要收集遍历。 – 2010-06-01 04:35:47

+0

是否有返回_productQuantity并设置productQuantity的原因?我通常使用相同的支持成员。 – 2010-06-01 04:38:11

+0

@Rob:我认为这是一个命名约定/数据隐藏的事情。我不记得我第一次看到它的时间/地点,但我一直在编写我的学校项目,直到现在我从未遇到过问题。我来自Java背景,所以C#中的set/get属性 - 在Java中我实际上必须为该功能编写getter和setter方法。我想我可能刚刚在某处看到了一些代码片段,并且在我的脑海中混杂了一些东西。 – KSwift87 2010-06-01 05:07:21

回答

8

问题是在你的产品数量

制定者应改为:

set 
    { 
     _productQuantity= value; 
    } 

编辑(命名约定):

public class Vertex3d 
{ 
    //fields are all declared private, which is a good practice in general 
    private int _x; 

    //The properties are declared public, but could also be private, protected, or protected internal, as desired. 
    public int X 
    { 
     get { return _x; } 
     set { _x = value; } 
    } 
} 
+0

在旁注:我没有在你的代码中找到其他的错误,只是这个特定的代码。如果可以的话, – VoodooChild 2010-06-01 04:37:05

+2

+1 1,000次;像这样的微妙的错误是配对编程的原因(或者至少有新鲜的眼睛盯着你的代码)。 – 2010-06-01 04:39:28

+0

亲爱的上帝,你好。我也没有期望得到如此快速的回应。谢谢谢谢!我不记得我在哪里学习编码属性,但由于某些原因,我从未将变量命名为与我在获取中所做的相同。我认为这是一个命名约定以及数据隐藏的事情......所以另一个问题是:什么是适当的命名约定的属性? – KSwift87 2010-06-01 04:56:49

3

更换productQuantity = value;_productQuantity = value;(你经常无限地通过一次又一次地调用setter)

+0

谢谢你的回应,但VooDoo的孩子是第一个。我仍然给你一个+1。 :-) – KSwift87 2010-06-01 05:07:56

2
public int productQuantity 
{ 
    get 
    { 
     return _productQuantity; 
    } 
    set 
    { 
     _productQuantity = value; //this should be an assignment to a member variable. 
    } 
} 
+0

谢谢你的回应,但VooDoo的孩子是第一个。我仍然给你一个+1。 :-) – KSwift87 2010-06-01 04:58:01

3

为什么不直接使用它呢? public int productQuantity {get;组; }

但缺陷是在_

public int productQuantity { 
    get { 
     return _productQuantity; 
    } 
    set { 
     _productQuantity = value; 
    } 
} 

cart = (List<OrderItem>)Session["cart"]; 
int index = cart.Find(OrderItem => OrderItem.productId == item.productId); 
if(index == -1) { 
    cart.Add(item); 
} else { 
    cart[index].productQuantity += item.productQuantity; 
} 
+0

谢谢你的回应,但VooDoo的孩子是第一个。我仍然给你一个+1。 :-)至于你的建议......我从来没有正式教过Lambda表达式,虽然我从未真正理解它们的用途/操作方式,但我已经看到了它们。 – KSwift87 2010-06-01 05:01:21

+0

你绝对应该阅读关于他们的教程。他们很容易遵循(无论如何是基本的),非常方便 – VoodooChild 2010-06-01 05:41:26

相关问题