如何创建具有不同属性值的大量对象?

时间:2018-01-01 19:12:47

标签: c# oop

我正在使用C#进行编程,我希望将大量新对象实例化到我的应用程序中,所有这些对象的类型都相同,但属性值不同。例如:

Student student1 = new Student();
student1.Name = "James";
student1.Age = 19;
student1.City = "Los Angeles";

Student student2 = new Student();
student2.Name = "Karen";
student2.Age = 20;
student2.City = "San Diego";

Student student3 = new Student();
student3.Name = "Bob";
student3.Age = 20;
student3.City = "Dallas";

这种编码方式对我来说似乎是错误的,因为如果我不需要3名学生,而是500名学生呢?那么最好的方法是什么?

我尝试使用for循环,但这不起作用,因为属性值不同。

最有效的方法是什么?

提前致谢。

6 个答案:

答案 0 :(得分:2)

为了在运行时对您的对象做任何事情,您可能希望它们在列表中。

无需读取文件或数据库等,最简洁的方法可能是:

<div (window:resize)="sizeChanged($event)" id="someId">
 <span *ngif="alarmCount &gt; 0">
  ×
 </span>
</div>

我不知道你的最终目标,这只是模拟数据,比如测试吗?

答案 1 :(得分:1)

像这样添加构造函数给学生

Student (string name, int age, string city)
{
    Name = name;
    Age = age;
    City = city;
}
///
Student student1 = new Student("James", 19, "Los Angeles");

答案 2 :(得分:0)

好吧,如果您通过更有效的方式执行此操作只是为了编写更少的代码,那么您可以实时分配属性的值,就像:

Student student1 = new Student() { Name = "James", Age = 19, City = "Los Angeles" };

如果您不仅要编写更少的代码,而且 - 让我们说 - 从另一个源(如Json列表或TXT文件)读取数据,您将不得不为其编写一个加载器。

答案 3 :(得分:0)

嗯,这取决于你将要使用它。如果是用于测试,那么您可以使用自定义构建工具来创建随机Student s:

public class RandomStudentCreator
{
    private readonly Random rnd = new Random();
    private readonly IList<string> cities, names;
    private readonly int minAge, maxAge;

    public RandomStudentCreator(
        IList<string> names,
        IList<string> cities,
        int minimumInckusiveAge,
        int maximumExclusiveAge)
    {
         //Argument validation here
         this.cities = cities;
         this.names = names;
         minAge = minimumInckusiveAge;
         maxAge = maximumExclusiveAge;
    }

    public Student Next()
    {
        var student = new Student();
        student.Name = names[rnd.Next(names.Count);
        student.City = cities[rnd.Next(cities.Count);
        Student.Age = rnd.Next(minAge, maxAge);
    }
}

如果这是生产代码,那么您应该根据以下内容创建学生:

  1. 用户输入
  2. 一些数据后端(数据库,文本文件等)
  3. 但无论如何,您不希望为每个学生创建变量。你可能想要collection名学生。根据你想要用它们做什么,你需要的集合类型可能会有所不同,框架为你提供了很多选择:

    1. 阵列:Student[]
    2. 列表:List<Student>
    3. 队列:Queue<Student>
    4. 筹码:Stack<Student>
    5. 设置:HashSet<Student>
    6. 最后但并非最不重要的是,您可能希望在Student中实现一个构造函数,该构造函数使用名称,城市和年龄来使实例化比您当前的实例更紧凑:

      public class Student
      {
          public Student(string name,
                         int age,
                         string city)
          {
              Name = name;
              Age = age;
              City = city;
          }
      
          //...
      }
      
      var john = new Student(“John”, 19, “LA”);
      

答案 4 :(得分:0)

编程与输入数据无关。需要大量数据? - 从文件,数据库,服务器,GUI等加载它们

您可以创建一个方便的构造函数,您可以创建工厂和构建器,但它们不是用于连续创建数百个对象。即使它是历史数据,有一天你会想要改变它们,修复它们。相信我,将它们与代码分开并存储在其他地方要比在以后编辑数百行代码容易得多。

答案 5 :(得分:0)

如果你想要500名学生,我建议将数据提取到文件,数据库等。student1 .. student499实现看起来非常丑陋:让我们组织它们到数组:Student[] students。例如,让我们使用格式为

的最简单的csv文件Students.csv解决方案
name,age,city

E.g。

name,age,city
James,19,Los Angeles
Karen,20,San Diego
Bob,20,Dallas

完成文件后,您可以轻松阅读:

  using System.IO;
  using System.Linq;
  ...

 Student[] students = File
   .ReadLines("Students.csv")
   .Where(line => !string.IsNullOrWhiteSpace(line)) // Skip empty lines
   .Skip(1)  // Skip header
   .Select(line => line.Split(','))   
   .Select(items => new Student() {
      Name = items[0],
      Age = int.Parse(items[1]),
      City = items[2], })
   .ToArray();