当对象名称相似时,使用循环计数器向列表中添加对象
本文关键字:对象 计数器 循环 添加 列表 相似 | 更新日期: 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
};
对此要小心,因为如果您不断向方法中添加参数,它很快就会变得非常难看。