2013-05-17 44 views
0

我很新的编程所以这可能是对你最愚蠢的问题,但还是因为我已经尝试在谷歌看看,这里有云:C#类目录和属性

我创建了一个具有一些属性和2个方法的类,其中一些属性应该是第一个方法,另一个属性是第二个方法。

这两种方法都会返回一个列表,我的问题是这两个列表都会返回所有的属性。不知道为什么,因为我'不使用所有的人在这两种方法......这里是一个例子:

class orders 
{ 
    public string invoiceID { get; set; } 
    public string employee { get; set; } 
    public string store { get; set; } 
    public string client { get; set; } 
    public string invoiceDate { get; set; } 
    public string total { get; set; } 
    public string totalYear { get; set; } 
    public string year { get; set; } 

public static List<orders> getOrders() 
{ 
    string sSQL = "bla bla bla huge query " 

    DBConnect connect = new DBConnect(); 
    DataTable dt = new DataTable(); 
    dt = connect.getBD(sSQL); 

    List<orders> o = new List<orders>(); 

    for (int i = 0; i < dt.Rows.Count; i++) 
    { 
     orders ord = new orders(); 

     ord.invoiceID = dt.Rows[i]["invoiceid"].ToString(); 
     ord.employee = dt.Rows[i]["empname"].ToString(); 
     ord.store = dt.Rows[i]["storename"].ToString(); 
     ord.client = dt.Rows[i]["clientname"].ToString(); 
     ord.invoiceDate = ((DateTime)dt.Rows[i]["invoicedate"]).ToString("dd-MM-yyyy"); 
     ord.total = dt.Rows[i]["total"].ToString(); 

     o.Add(ord); 
    } 

    return o; 

所以在这个方法我没有使用的公共属性一年totalYear,但他们仍然出现在列表:(

我在做什么错?

预先感谢和抱歉noob问题。

更新1(第二种方法)

public static List<orders> getTotalYearInvoices() 
     { 
      DateTime date = DateTime.Now; 
      int year = date.Year; 

      List<orders> o = new List<orders>(); 

      for (int i = 2009; i < year; i++) 
      { 
       string sSQL = " another huge query" 

       DBConnect connect = new DBConnect(); 
       DataTable dt = new DataTable(); 
       dt = connect.getBD(sSQL); 
       orders ord = new orders(); 
       ord.year = i.ToString(); 

       for (int j = 0; j < dt.Rows.Count; j++) 
       { 
        ord.totalYear = dt.Rows[j]["total"].ToString(); 
       } 

       o.Add(ord); 
      } 

      return o; 
     } 
+0

你能否确认你发布了该课程的所有代码?我只在你的班级看到一种方法。 – Matthew

+0

@Matthew在这种情况下,它并不重要,因为问题是他对OOP的理解 – WiiMaxx

+0

@Mthethew我只发布了一种方法是的,我认为这是足够的,因为第一种方法没有设置所有的属性,我仍然把它们全部列入清单。 – n3bi0s

回答

1

你的问题不是你的代码的问题是什么,你知道你在做:)
你的代码面向对象的代码,所以你应该学习OO是什么,它是如何工作

但现在贵“的问题”,大家会看到你的属性,因为他们都是public所以让基于代码的Digg的到OO

让我们与您的类名orders

开始应该是Order,因为这种类型的每个对象将是一个单一的顺序。

现在让我们看看哪些属性只针对订单

public string invoiceID { get; set; } 
public string employee { get; set; } 
public string store { get; set; } 
public string client { get; set; } 
public string invoiceDate { get; set; } 
public string total { get; set; } 

好,现在我们拥有的所有相关性能有关。

之后,我们可以用你的方法打手

你的第一个方法public static List<orders> getOrders()
我将其重命名为public static List<Order> getAllOrders()
GETALL因为我不能在你提供的代码看到的限制,您的列表将正常包含从数据库否则你应该限制添加到您的方法名称(样品getOpenOrders()

OK现在你的第二个甲基所有订单od

现在它来了,我们需要2个属性!?!

public string totalYear { get; set; } 
public string year { get; set; } 

对不对?没有真正 现在你有多种选择

  • 创建一个单独的类,它会包含此属性
  • 使用anonymous Type
  • 使用Dictionary
  • 使用DataTable

那现在你自己决定...

+0

谢谢你的解释,正如我所说,仍在学习。欣赏所有评论和答案。 – n3bi0s

+1

@ n3bi0s很高兴我能帮助你。也许你应该在基于一些教程的面向对象编程中多挖一点:) – WiiMaxx

3

我真的不明白你的意思。

您的属性:

public string totalYear { get; set; } 
public string year { get; set; } 

设定为公开,让它们出现在列表中:

List<orders> getOrders() 

如果你不希望它们出现只是让他们私人。

此外,如果您不希望所有订单属性出现,您可以创建几个类并从它们继承。

认为您正在重新调整所有属性 设置为公开的订单清单,因此它们将始终显示,尽管它们没有 正在初始化或具有值。

您应该创建两个不同的类。一个是订单,另一个是订单日期,如果你不希望他们总是出现。

+0

尝试已经..如果我把它们设为私人,列表空来......“没有数据显示” – n3bi0s

+0

告诉我们第二种方法来了解你是什么试图做 –

+0

刚刚编辑帖子 – n3bi0s

1

getOrders方法返回的是订单列表。 orders类有属性year和totalYear,即使你没有设置它们,当你实例化这个类的实例时,它们所需的空间也会被分配。

顺便说一句,我建议你使用Pascal Casing类型名称,也使用单数名词为他们。 (即订单而不是订单)。

+0

感谢您的意见,我会改变我的课程:) – n3bi0s

1

你可以将类orders分成两类: (你有没有原因?)

public class BaseOrders 
{ 
    public string invoiceID { get; set; } 
    public string employee { get; set; } 
    public string store { get; set; } 
    public string client { get; set; } 
    public string invoiceDate { get; set; } 
    public string total { get; set; } 


    public static List<BaseOrders> getOrders() 
    { 
     //your implementation 
    } 
} 

,然后你可以有你的约会订单

public class DateOrders 
{ 
    public string totalYear { get; set; } 
    public string year { get; set; } 

public static List<DateOrders> getTotalYearInvoices() 
{ 
    //your implementation 
} 
} 
+0

谢谢。我会改变我的课程:) – n3bi0s

3

考虑到您正在试图像订购类的某种发票系统或购物车一样处理订单类,我会为此考虑两个课程。

public class InvoiceSystem 
{ 
    private List<Invoice> currentOrders; 

    public InvoiceSystem() 
    { 
     currentOrders = new List<Invoice>(); 
    } 

    public void Populate() 
    { 
     //fill your list from the database 
    } 

    public void Save() 
    { 
     //Save list back to database 
    } 

    public List<Invoice> GetInvoices(/*perhaps something to filter */) 
    { 
     // return filtered list, or entire list. 
    } 

    public decimal GetTotalForYear(int year) 
    { 
     // iterate through list (or use linq) to get total and return it 
    } 
} 




public class Invoice 
{ 
    public int  InvoiceID { get; set; } 
    public string Employee { get; set; } 
    public string Store { get; set; } 
    public string Client { get; set; } 
    public DateTime InvoiceDate { get; set; } 
    public decimal Total { get; set; } 
} 
+0

谢谢你的解释我会改变我的课程:) – n3bi0s

+0

@ n3bi0s不客气,祝你好运! –

+1

+1以获得较好的解决方案 –