如何创建多个对象并在c#中枚举它们

时间:2009-08-05 20:10:59

标签: c#

我的问题如下:

我正在构建一个控制台应用程序,它向用户询问它应该创建的对象数量以及必须为每个对象分配的4个变量。 新对象名称应包含从1开始的计数。

你会如何解决这个问题? 我正在考虑一个类,但我不确定如何从userinput在运行时创建对象。循环是最好的方法吗?

你会推荐什么样的类,结构,列表,数组....对象中的变量总是相同的类型,但我需要正确命名它们,这样我就可以有效地编写方法,在程序的后期阶段对它们执行操作。

我只是学习语言,我非常感谢有关如何解决问题的建议。

4 个答案:

答案 0 :(得分:3)

如果我理解你的问题:

class MyClass
{
    public int ObjectNumber { get; set; }
    public string SomeVariable { get; set; }
    public string AnotherVariable { get; set; }
}

// You should use keyboard input value for this 
int objectsToCreate = 10;

// Create an array to hold all your objects
MyClass[] myObjects = new MyClass[objectsToCreate];

for (int i = 0; i < objectsToCreate; i++)
{
    // Instantiate a new object, set it's number and
    // some other properties
    myObjects[i] = new MyClass()
    {
        ObjectNumber = i + 1,
        SomeVariable = "SomeValue",
        AnotherVariable = "AnotherValue"
    };
}

这并不是你所描述的。添加键盘输入和东西:)大部分代码需要使用某种Main方法来实际运行等。

在这种情况下,我选择了class来保存您的4个变量。我只实现了3,我已经将它们实现为属性,而不是字段。我不确定这对你的任务是否有必要,但一般来说这是一个很好的习惯,没有公共场所,我不想成为教你不良习惯的人。请参阅auto-implemented properties

您提到了struct,这也是一个选项,具体取决于您要存储在其中的内容。一般来说,一个班级会更安全。

循环确实是初始化对象的方法。在这种情况下,for循环是最实用的。它从0开始计数,因为我们将对象放在一个数组中,而C#中的数组索引总是从0开始。这意味着您必须使用i + 1分配给对象编号,或者对象编号为0 - 9,就像它们在数组中的索引一样。

我正在使用object initializer syntax初始化对象,这是C#3.0中的新功能。 老式的方法是逐个分配它们:

myObjects[i] = new MyClass();
myObjects[i].ObjectNumber = i + 1;
myObjects[i].SomeVariable = "SomeValue";

或者,您可以为MyClass定义constructor,其中包含3个参数。

最后一件事:这里的一些人发布了使用通用列表List<MyClass>)而不是数组的答案。这样可以正常工作,但在我的例子中,我选择使用你可以使用的最基本的形式。与数组不同,List没有固定的大小(注意我是如何初始化数组的)。如果您想稍后添加更多项目,或者您事先不知道需要存储多少项目,列表很棒。但是,在这种情况下,我们有键盘输入,所以我们确切地知道我们将拥有多少项。因此:数组。它将隐含地告诉谁正在阅读您的代码,您不打算稍后添加更多项目。

我希望这回答了一些问题,并提出了一些新的问题。看看兔子洞有多深:P

答案 1 :(得分:0)

使用列表或数组。列表示例:

int numberOfObjects = 3;
List<YourType> listOfObjects = new List<YourType>();
for(int i = 0 ; i < numberOfObjects ; i++ ) 
{
    // Get input and create object ....
    // Then add to your list
    listOfObjects.Add(element);
}

这里,listOfObjects是一个通用列表,可以包含可变数量的YourType类型的对象。该列表将自动调整大小,以便它可以保存您添加到其中的对象数。希望这会有所帮助。

答案 2 :(得分:0)

如果我明白你的要求,你可能会做这样的事情:

class Foo 
{
   private static int count;
   public string name;
   public Foo(...){
     name = ++count + "";
   }
}

答案 3 :(得分:0)

我猜你在这里要做什么,但这是在黑暗中刺伤。我遇到的问题是处理整个“新对象名称应该包含一个从1开始的计数”的事情。无论如何,这是我的尝试:

public class UserInstantiatedClass
{
   public int UserSetField1;
   public int UserSetField2;
   public int UserSetField3;
   public int UserSetField4;
   public string UserSpecifiedClassName;
}

public static class MyProgram
{
   public static void Main(string [] args) 
   {
      // gather user input, place into variables named 
      // numInstances, className, field1, field2, field3, field4
      List<UserInstantiatedClass> instances = new List< UserInstantiatedClass>();
      UserInstantiatedClass current = null;
      for(int i=1; i<=numInstances; i++)
      {
         current = new UserInstantiatedClass();
         current.UserSpecifiedClassName = className + i.ToString(); // adds the number 1, 2, 3, etc. to the class name specified
         current.UserSetField1 = field1;
         current.UserSetField2 = field2;
         current.UserSetField3 = field3;
         current.UserSetField4 = field4;
         instances.Add(current);
      }
      // after this loop, the instances list contains the number of instances of the class UserInstantiatedClass specified by the numInstances variable.  
   }
}