当对象名称相似时,使用循环计数器向列表中添加对象

本文关键字:对象 计数器 循环 添加 列表 相似 | 更新日期: 2023-09-27 18:13:36

我有一个"Address"类,并创建10个实例,如下所示:

Address ad1 = new Address(){
OwnerId = 1,
Street = "Papanikolaou 3",
ProvinceId = 1,
PostalCode = "13245",
TownId = 1,
CountryId = 1,
TypeId = 1,
Active = true
  };

每个新对象名称只更改名称末尾的数字。在例子:

Address ad2 = new Address();
Address ad3 = new Address();

等等…

接下来我要将所有这些对象添加到一个列表中。由于对象名称相似,我可以使用"for"循环,并使用循环计数器来"更改"对象名称,因为"Address"类的每个实例名称都是如此相似?

E。G(我知道这行不通):

List<Address> lst = new List<Address>();
for(i = 1; i <= 10; i++) {
  lst.add(adi);
} 

当对象名称相似时,使用循环计数器向列表中添加对象

如果您需要创建10个对象并将其添加到没有'Name'的列表中,您可以这样做

List<Address> lst = new List<Address>();
for(i = 1; i <= 10; i++) {
   lst.Add(new Address())
} 

否则,您可以使用Dictionary为对象命名并添加到List<Dictionary<string,Object>>()

 List<Dictionary<string, object>> data = new List<Dictionary<string, object>>();
 Dictionary<string, Object> objs = new Dictionary<string, object>();
 for (int i = 1; i <= 10; i++)
 {
   objs.Add(i.ToString(), new Address() { OwnerId = "test", ProvinceID = "test2" });
 }

由于变量名只是引用,因此据我所知,没有(有用的)方法可以做到这一点。

但是它足够简单,像这样:

lst.add(new Address(){
    OwnerId = 1,
    Street = "Papanikolaou 3",
    ProvinceId = 1,
    PostalCode = "13245",
    TownId = 1,
    CountryId = 1,
    TypeId = 1,
    Active = true
 };

我不建议以这种方式构建对象,但是,这是一个需要解决的有趣问题。

这取决于你如何声明变量。如果它们是一个类的公共字段,你可以通过反射获得它们:

       private static void Main(string[] args)
    {
        var addressContainer = new AddressContainer();
        var fields = addressContainer.GetType().GetFields();
        List<Address> lst = new List<Address>();
        foreach (var field in fields)
        {
            //print varialbe name
            Console.WriteLine(field.Name);
            var theValue = field.GetValue(addressContainer);
            if (theValue is Address) lst.Add((Address) theValue);
        }
        //spit out the collected address street values
        foreach (var address in lst)
        {
            Console.WriteLine(address.Street);
        }
        Console.ReadLine();
    }
}
public class AddressContainer
{
    public Address ad1 = new Address() { Street = "Papanikolaou 3" };
    public Address ad2 = new Address() { Street = "Papanikolaou 7" };
}
public class Address
{
    public string Street { get; set; }
}

如果它们只是局部变量,它要求你的代码了解当前应用领域可访问的所有对象。这并不容易做到。以下的帖子可能会让你感兴趣:

  • 如何获得转储…
  • 如何列出所有变量…

在实践中,您应该像Michael和Sajeetharan建议的那样获得对列表的引用,以便您可以根据需要对其进行操作。

嗯,你可以按照Michael的回答做,或者你可以将实例化移动到一个方法中,最后像这样:

lst.add(BuildAddress(1, "Papanikolau 3", 1, "13245", 1, 1, 1, true));
// etc

其中BuildAddress只是基于这些参数创建一个地址实例

private Address BuildAddress(int ownerId, string street, int provinceId, string postalCode, int townId, int countryId, int typeId, bool isActive)
    return new Address()
    {
        OwnerId = ownerId,
        Street = street,
        ProvinceId = provinceId,
        PostalCode = postalCode,
        TownId = townId,
        CountryId = countryId,
        TypeId = typeId,
        Active = isActive
    };

对此要小心,因为如果您不断向方法中添加参数,它很快就会变得非常难看。