2013-10-29 73 views
1

我需要一些帮助。C# - 列表内部列表

我试图在列表中存储信息。

例如,在数量,年龄,地址和头发颜色的用户类型...

我想使列表里面列出来存储信息,像这样:

[0] Number 

----[0] Age 

----------[0] Address 

----------[1] Adrress 

--------------[0] Hair Color 

如果有更好的方法来做到这一点,请帮助我!
列表里面的列表我会很困惑,但如果是更好的解决方案,我没有问题。

+12

为什么不使一个类?然后你可以有一个包含东西的类的列表。 –

+1

列表并不意味着像您的示例一样保存结构化数据。 – xbonez

+0

@ Pierre-LucPineault你能解释我该怎么做吗? –

回答

8

将逻辑分组数据存储为原始值数组并不是真正的方法。相反,replace the array with an object只是存储对象的列表。在您的例子中,对象可以是简单的:

class Person 
{ 
    public int Number { get; set; } // it's not clear what this value means 
    public int Age { get; set; } 
    public string Address { get; set; } 
    public string HairColor { get; set; } 
} 

您可以到这个对象添加更多的属性,逻辑,验证,强类型枚举(对于像HairColor)等。保持这个集合很简单:

var people = new List<Person>(); 

一个你会立即注意到这种方法是,Person的结构可以改变,而无需改变其中任何一个存储Person S中藏品的主要优势。您可以添加/更改/删除属性,它仍然只是一个List<Person>。您只需更改使用您正在更改的组件的代码即可。

另一个关键的好处是你可以封装所有在这个类中定义一个Person的逻辑,所以其他代码不需要担心它。因此,例如不必重新编写相同的验证逻辑(总是确保Age是一个有效的正数,诸如此类),您可以将它写在对象上,并将它应用于任何地方。正如Eric Raymond曾经说过的那样:“智能数据结构和哑代码比其他方式工作得更好。”

4

你需要一个类结构来看看这个例子:

public enum AddressType{ 
    Work, 
    Home, 
    Other 
} 

class Address{ 
    public AddressType AddressType{get;set;} 
    public AddressLine1 {get;set;} 
    public AddressLine2 {get;set;} 
    public string City{get;set;} 
    public string State{get;set;} 
} 

class User 
{ 
    public int Age{get;set;} 
    public string FirstName{get;set;} 
    public string LastName{get;set;} 
    public string HairColor{get;set;} 
    public List<Address> AddressList{get;set;} 
    public User(){ 
     AddressList = new List<Address>(); 
    } 
} 

class UserList:List<User>{ 
} 

然后你就可以利用这个代码是这样的:

var users = new UserList(); 
var usr = new User{FirstName = "Steve", LastName="Ruben", Age = 32, HairColor = "Brown"}; 
usr.AddressList.Add(new AddressList{AddressLine1 = "Address ln 1", AddressLine2 = "Address ln 2", City = "Some Place", State = "WI", AddressType = AddressType.Home}); 
users.Add(usr);