【问题标题】:Using a loop counter to add objects to a list, when object names are similar当对象名称相似时,使用循环计数器将对象添加到列表中
【发布时间】:2015-09-19 18:19:48
【问题描述】:

我有一个“地址”类,并像这样创建 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”循环,并使用循环计数器来“更改”对象名称,因为“地址”类的每个实例名称都非常相似?

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

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

【问题讨论】:

  • 有可能,但是你必须考虑如何不创建所有这些变量^_^提示:在循环中创建所有这些东西,然后使用列表操作。

标签: c# list


【解决方案1】:

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

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

否则,您可以使用 Dictionary 为对象命名并添加到 List&lt;Dictionary&lt;string,Object&gt;&gt;()

 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" });
 }

【讨论】:

    【解决方案2】:

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

    但这很简单:

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

    【讨论】:

      【解决方案3】:

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

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

             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 的建议获取对列表的引用,以便您可以根据需要对其进行操作。

      【讨论】:

        【解决方案4】:

        好吧,您可以按照Michael's answer 的方式进行操作,或者您可以将实例化移动到一个方法并最终得到类似的结果:

        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
            };
        

        请注意这一点,因为如果您不断向方法中添加参数,它很快就会变得非常难看。

        【讨论】:

          猜你喜欢
          • 2011-02-09
          • 2010-11-13
          • 1970-01-01
          • 2015-08-29
          • 1970-01-01
          • 1970-01-01
          • 2018-05-19
          • 1970-01-01
          • 2013-09-08
          相关资源
          最近更新 更多