【问题标题】:How to fill a variable in class in array of classes?如何在类数组中填充类中的变量?
【发布时间】:2022-01-19 20:33:09
【问题描述】:

我有一个只有一个变量的类

public class C
{
   int i;
}

在另一个项目文件中,我创建了一个类数组

C[] classes = new C[100000];

那么我需要做些什么来为每个类中的“i”变量设置一些随机值?

【问题讨论】:

  • 呃..你不能。该字段是私有的,因此如果 C 类本身没有设置它,则没有任何东西* 可以,并且它将始终具有其默认值 0。考虑将其设置为具有更有趣和有用的自描述名称的公共属性,并且然后在 for 循环外使用 new Random() 重复执行 c[someindexvariable].ReallyGoodPropertyName = random.Next(lowestValueYouWant, oneMoreThanHighestValueYouWant)
  • 为什么还要使用一个类呢?你有原始类型 int 并且可以只使用 int 的数组?
  • 我有一个大学工作,根据练习@RyanWilson,这个“i”变量必须在课堂上
  • 好的,谢谢,我试试@CaiusJard
  • 如果它必须是 i 就像那样,你必须(==我建议)将你想要初始化 i 的随机数传递给设置它的构造函数

标签: c# arrays class


【解决方案1】:

首先您需要使C.i 可访问。一种方法是将C.i 设为公共财产。当您使用它时,public fields should be pascal cased 和所有标识符都应该具有有意义的名称。

在命名public 类型的成员时,例如字段、属性、事件、方法和本地函数,请使用帕斯卡大小写。

public class Foo {
    public int Bar { get; set; }
}

然后你会使用System.Random。实例化一次,每次需要随机数时调用Random.Next

using System;
var rand = new Random();

// int anyPositiveInt = rand.Next();
// int positiveIntLessThanFifteen = rand.Next(15);
// int intFromOneToFour = rand.Next(1, 5);

最后,按照Creating N objects and adding them to a list中的例子,使用System.LinqEnumerable.RangeEnumerable.SelectEnumerable.ToArray如下:

Foo[] classes = Enumerable
    .Range(0, 100000)
    .Select(_ => new Foo { Bar = rand.Next() }) 
    .ToArray();

【讨论】:

    【解决方案2】:

    如果要求使用私有字段,那么我放弃之前的建议,将其设为公共属性 - 可能尚未教授属性

    static void Main()
    {
        var r = new Random();
        
        var maxValueOfI = 100;
        var minValueOfI = -20;
    
        var csArr = new C[100000];
    
        for (var julius = 0; julius < csArr.Length; julius++) {
            var brutus = r.Next(minValueOfI, maxValueOfI+1);
            csArr[julius] = new C(brutus);
        }
    }
    
    public class C
    {
        private int _i;
    
        public C(int i){
          _i = i;
        }
    }
    

    那么,这里发生了什么?

    主要添加的是 C 的构造函数。构造函数是 C# 在构造新对象时调用的特殊方法。每个类都有一个,即使你看不到它(如果你看不到,编译器会提供一个)。构造函数是旨在确保类已完全设置并准备好使用的方法。因为它在类内部,所以它可以完全访问类的所有数据字段:

    public C(int i){
      _i = i;
    }
    

    此构造函数接受一个 int,并将私有字段 _i 设置为传入数字的值。对字段使用这种命名模式(带有下划线的前缀)是很常见的,它有助于避免与方法的参数发生名称冲突(在本例中称为i)。如果它们都被称为i,则第一类必须以this. 为前缀,并且(恕我直言)更混乱

    这行代码调用了构造函数:

    csArr[julius] = new C(brutus);
    

    我们之前计算了一个介于 -30 和 100(包括两端)之间的随机数,并将其存储在一个名为 brutus 的变量中。这个数字被传递给构造函数,当我们说new C 时会调用它。生成的完全构造的 C 实例存储在数组槽之一中

    【讨论】:

      【解决方案3】:

      试试这个

      static void Main()
      {
          Random rand = new Random();
          
          var max=100000;
      
          C[] array = new C[max];
      
          for (var i=0; i <max; i++)
              array[i] = new C { Num = rand.Next(0, max)}; 
             
            // or using a constructor
              array[i] = new C (rand.Next(0, max)); 
      }
      
      public class C
      {
          public int Num {get; set;}
      
         public C (int num)
         {
            Num=num;
         }
      
       public C (){}
      
      }
      

      【讨论】:

        【解决方案4】:

        首先,在您当前的代码中,i 是一个 private 字段。让我们添加一个构造函数来设置这个字段:

        public class C {
          int i;
        
          public C(int value) {
            i = value; 
          }
        }
        

        那你可以试试Linq

        using System.Linq;
        
        ...
        
        Random rand = new Random();
        
        ...
        
        C[] classes = Enumerable
          .Range(0, 100000)
          .Select(i => new C(rand.Next(0, 100))) //TODO: Put the right range here
          .ToArray();
        
        

        【讨论】:

          猜你喜欢
          • 2017-03-19
          • 1970-01-01
          • 2023-04-03
          • 2022-01-27
          • 2021-11-10
          • 2021-07-07
          • 2018-09-03
          • 2016-05-27
          • 2018-08-09
          相关资源
          最近更新 更多