【问题标题】:Initialize an array to a value [duplicate]将数组初始化为一个值[重复]
【发布时间】:2012-10-03 10:11:08
【问题描述】:

可能重复:
How to populate/instantiate a C# array with a single value?

给定双数组

   double[] constraintValue = new double[UnUsedServices.Count];

我想用-1初始化所有条目,有简单的语法吗?

【问题讨论】:

标签: c#


【解决方案1】:
double[] constraintValue = Enumerable.Repeat<double>(-1d,UnUsedServices.Count).ToArray();

【讨论】:

    【解决方案2】:
    for(int i = 0; i < constraintValue.Length; i++)
        constraintValue[i] = -1;
    

    【讨论】:

    • Count 用于收藏。替换为 Length 用于数组
    • 我使用了问题中的长度值
    • 嗯,这似乎是直观的...我只是希望 c# 可能有一些语法糖,但似乎没有。
    【解决方案3】:
     double[] constraintValue = Enumerable.Repeat(-1D, UnUsedServices.Count).ToArray();
    

    【讨论】:

      【解决方案4】:

      您的问题的确切答案是:

      for(var i =0; i < constraintValue.Length; i ++)
      {
          constraintValue[i] = -1;
      } 
      

      但是,如果您想要“未设置”值,为什么不使用 Nullable&lt;double&gt;

      double?[] constraintValue = new double?[UnUsedServices.Count];
      
      constraintValue[10] = 42D;
      constraintValue[20] = 0D;
      
      var x1 = contraintValue[10].HasValue; // true
      var x1val = contraintValue[10].Value; // 42D
      
      var x2 = contraintValue[20].HasValue; // true
      var x2val = contraintValue[20].Value; // 0D
      
      var x3 = contraintValue[10].HasValue; // false
      //var x3val = contraintValue[10].Value; // exception
      

      【讨论】:

      • 谢谢,在这里学到了新东西。
      【解决方案5】:

      你可以试试

      for(int i =0; i < constraintValue.Length; i ++)
      {
      constraintValue[i] = -1;
      } 
      

      【讨论】:

        【解决方案6】:

        不知道你是否会称之为“简单”:

        double[] constraintValue = new double[]{ -1, -1, 
                                                 ... (UnUsedServices.Count times)};
        

        当然,执行此操作的标准方法是循环遍历每个数组项以对其进行初始化:

        for(int i = 0; i < constraintValue.Length; i++)
        {
            constraintValue[i] = -1;
        }
        

        【讨论】:

          【解决方案7】:
          for (int i = 0; i < constraintValue.Length; i++)
              constraintValue[i] = -1;
          

          【讨论】:

            【解决方案8】:
                int[] initilize_array = newint[10];
            
                for (int i = 0; i <initilize_array.Length; i++)
            
                {
            
                initilize_array[i] = -1;
            
                }
            

            这是最简单的方法

            【讨论】:

              【解决方案9】:

              如果您需要更快的性能,那么 Enumerable.Repeat 使用 TPL 并行执行:

              double[] constraintValue = new double[UnUsedServices.Count];
              Parallel.For(0, UnUsedServices.Count, index => constraintValue[index] = -1);
              

              【讨论】:

              • 没有。不在这里。对其进行基准测试,您将看到性能大幅下降。为什么?因为并行化的工作非常小而且便宜。如果您添加并行性,您的应用程序将不得不使用线程、上下文切换、锁等。这种结构成本远远大于收益。
              • 为了增加 steve 的 cmets,您还破坏了内存本地化。访问顺序内存位置比“随机”访问内存要快得多,这将是并行化的结果。
              • 是的,忽略这个。我低估了这个场景的优化程度。我将它与 Enumerable.Repeat 放在一起。 Enumerable.Repeat 非常慢,但接受答案中的简单 for 循环比这两种解决方案都要快得多,直到数组中有大约 1000 万个条目,此时 Parallel 与 for 循环同样快。
              猜你喜欢
              • 2012-04-30
              • 1970-01-01
              • 1970-01-01
              • 2017-01-22
              • 1970-01-01
              • 1970-01-01
              • 2018-08-09
              • 2014-10-13
              • 1970-01-01
              相关资源
              最近更新 更多