具有多个对象或列表的类

时间:2018-08-26 17:09:24

标签: c# list class object

我是OOP和C#的新手,所以有一个潜在的菜鸟问题。

查看类,我看到的所有代码都需要对对象名称进行硬编码。举例来说,我们不知道用户将输入多少Customers,以及他们的名字是什么。那如何创建类实例呢?

是否只创建一类客户作为数据类型(使用所需的方法)并将其存储在列表中?还是一个类可以容纳一个对象的多个实例,但可以创建它们并根据用户输入动态命名它们?

我还不太了解类如何在内存中保存记录等。

4 个答案:

答案 0 :(得分:3)

如果您需要在某个对象中进行迭代,我将使用List

如@wazz所述,您应该将它们存储在列表中,如下所示:

List<Customer> customers = new List<Customer>();

然后,您可以开始使用列表,添加新实例,删除等等。

您可以在docs上查看更多信息。

答案 1 :(得分:2)

将客户存储在集合中。有许多不同的收集类型。最受欢迎的2种可能是List<T>Dictionary<TKey, TValue>

List<T> ,其中T是一种类型(在您的情况下为Customer

List<Customer> customers = new List<Customer>();

Customer c = new Customer { Name = "My first customer" };
customers.Add(c);

c = new Customer { Name = "My second customer" };
customers.Add(c);

customers.Add(new Customer { Name = "My third customer" });

可以通过从零开始的索引访问列表中的客户

Customer c = list[5]; // Get the 6th customer

列表也可以枚举:

foreach (Customer cust in customers) {
    Console.WriteLine(cust.Name);
}

Dictionary<TKey, TValue> :通过字典,您可以通过键来查找客户,例如客户编号。

Dictionary<string, Customer> customers = new Dictionary<string, Customer>();

Customer c = new Customer { Id = "C1", Name = "My first customer" };
customers.Add(c.Id, c); // The Id is used as key, the customer object as value.

然后您可以通过

将其找回
Customer c = customers["C1"];

如果提供的密钥不存在,这将引发异常。为避免异常,您可以编写:

string id = "XX";
if (customers.TryGetValue(id, out Customer cust)) {
    Console.WriteLine(cust.Name);
} else {
    Console.WriteLine($"Customer '{id}' not found");
}

答案 2 :(得分:1)

为了帮助您首先理解课程。

类是数据外观的蓝图。如果要盖房子,例如,要盖房子,首先要制作蓝图。这些印刷品可以用来制造许多看起来一样的房屋。这些房屋的不同之处在于颜色,木材,砖块或乙烯基,以及是否铺有地毯等区域。这只是一个示例,但让我们将这栋房子变成一个类(蓝图),然后将其中几栋房子变成实际的单个对象;最后,让我们引用同一位置的所有对象(使用列表)。

首先让我们决定我们的房屋选择是什么,这些因素使它们与众不同。它是彩色的,外部的,有或没有地毯。在这里,为了简单起见,我们将颜色设置为string(文本),将外观设置为enum(因此将选项进行硬编码),并在地毯上设置bool或不设置{true或false )。

首先让我们制作enum,因为它与类分开但在类中使用。

public enum Exterior { Brick, Vinyl, Wood }

现在让我们制作课程(蓝图)。

public class House 
{
    public string Color { get; set; }
    public Exterior Exterior { get; set; }
    public bool HasCarpet { get; set; }
}

现在我们有了蓝图,让我们实际建造一些房屋。当我们制作它们时,我们需要一种在内存中定位它们的方法,以便将它们分配给一个变量。假设我们在控制台应用程序中,这是main方法的前几行。

var house1 = new House();
var house2 = new House();
var house3 = new House();

现在,我们在内存中拥有3个独立的房子,可以通过引用house1house2house3来访问其中的任何一个。但是,这些房屋的建造方式仍然相同,不幸的是没有颜色(由于字符串Color为空),默认为Brick(因为第一个枚举为Brick),并且没有地毯(由于HasCarpet默认为false)。

我们可以通过引用每个房屋对象引用并分配这些值来解决此问题……

house1.Color = "Red";
house1.Exterior = Exterior.Wood;

我们可以为这些类提供一个构造函数,该构造函数需要以这些值作为参数开头,或者我们可以使用更简单的内联方式(由于C#语法的强大功能)。

var house1 = new House()
             {
                 Color = "Red",
                 Exterior = Exterior.Wood
             };

我们也可以给它铺地毯,但是由于这所房子不会有任何东西,并且默认为false,所以我将其遗漏了。

好,让我们说我们已经通过我们的蓝图建造了所有3栋房屋。现在,将它们一起存储在一个列表中。首先,我们需要将List变成一个对象,并对其进行引用。

var houses = new List<House>();

现在让我们将房屋添加到列表中。

houses.Add(house1);
houses.Add(house2);
houses.Add(house3);

现在houses是对我们所有房屋对象的引用。如果要在列表中找到房子,可以使用索引(从0开始)并在列表中获取该位置。因此,假设house2需要铺地毯,但我们现在想使用列表来引用它。注意:有很多方法可以引用列表中的项目,这是基本方法。

houses[1].HasCarpet = true;

我在手机上这样做,希望没有错误。我的意图是清楚地回答您的问题并进行教育,并帮助您更好地理解课堂。

答案 3 :(得分:0)

您很有可能会使用IEnumerable<Customer>。现实生活中的Customer类与数据库有关。

在处理数据库时,会想到使用IQueryable<Customer>(从IEnumerable继承)的Linq。如果需要,您还可以使用其他集合类型,例如List<Customer>Dictionary<...>