【问题标题】:generate array between two numbers without linQ c#在没有linQ c#的两个数字之间生成数组
【发布时间】:2015-10-09 07:46:53
【问题描述】:

我不想在没有 LINQ 或 lambda 表达式的情况下生成一个数字在 500-1500 之间的int[],然后查看它是否等于除以 3 之间的数字,然后对其求和并计算总和中的平均值。

我如何在没有 LINQ 或 lambda 表达式的情况下做到这一点。

这是一个 C# 控制台应用程序

到目前为止我已经试过了:

        int[] tal = new int[1500];

        for (int i = 500; i < tal.Length; i++)
        {
            tal[i] += i;
        }

        int summa = 0;

        for (int i = 0; i <= 1500; i++)
        {
            if (tal[i] % 3 == 0)
            {
                summa += tal[i];
            }
            }

【问题讨论】:

  • 要生成数组,只需要一个普通的数组创建表达式,然后是一个for循环...
  • “看看它是否等于除以 3 之间的数字,然后将其相加并计算总和中的平均值” 换句话说,你能解释一下吗?
  • 介于 500-1500 您的数组长度应为 1000。并像这样填写tal[i] += i + 500;

标签: c# arrays linq


【解决方案1】:

创作:

  // inclusive
  int from = 500;
  // inclusive
  int to = 1000;

  int[] tal = new int[from - to + 1]; // both "from" and "to" are inclusive

  for (int i = 0; i < tal.Length; ++i)
    tal[i] = from + i;

求和/平均:

  int summa = 0;
  int count = 0; 

  foreach (var v in tal)
    if (v % 3 == 0) {
      summa += v;
      count += 1;
    }

  Double average = ((Double)summa) / count;

仅供参考,Linq 解决方案:

  var summa = Enumerable
    .Range(from, to - from + 1) // both "from" and "to" are inclusive
    .Where(item => item % 3 == 0)
    .Sum();

  var average = Enumerable
    .Range(from, to - from + 1) // both "from" and "to" are inclusive
    .Where(item => item % 3 == 0)
    .Average();

【讨论】:

    【解决方案2】:

    这里是我的解决方案:

    const int from = 501, to = 1500;
    const int n = (to - from)/3 + 1;
    const int result = (from + to)*n/2;
    Console.WriteLine(result);
    

    它绝对不使用 LINQ、lambda 甚至数组(因为这里不需要它们)或变量(所有 const 表达式都将在编译时计算)。你可能想减少它,所以结果程序将是:

    Console.WriteLine((501 + 1500)*((1500 - 501)/3 + 1)/2);
    

    甚至

    Console.WriteLine(334167);
    

    如果你需要一个平均值,那么 n 的值会减少,你可以这样写:

    const int from = 501, to = 1500;
    const double result = (from + to)/2.0;
    Console.WriteLine(result);
    

    【讨论】:

      【解决方案3】:
      int[] tal = new int[1500];
      

      这会初始化一个长度为 1500 的数组。

      for (int i = 500; i < tal.Length; i++)
      

      这会将 1000 个数字插入到数组中(从 500 到 1499)。

      for (int i = 0; i <= 1500; i++)
      

      这会遍历数组中的 1501 个数字。

      因此,您的数组应该是int[1000],第二个循环中的条件应该是i &lt; 1000。或者int[1001],如果你想要从 500 到 1500 的所有数字,你的第一个 for 循环中的条件应该是 i &lt;= tal.Length

      【讨论】:

      • 其实最后一行迭代了数组中的1501个数字,这也是个问题。
      • @FrédéricHamidi 感谢您的关注。已编辑。
      【解决方案4】:

      您不必创建1500 长度数组。因为你不需要第一个 500 元素。还可以使用计数器来计算在第二个循环内完成的总和数,然后取平均值。

      int[] tal = new int[1000];
      
      for (int i = 0; i < tal.Length; i++)
      {
          tal[i] += i + 500; // 500 based number
      }
      
      int summa = 0;
      int k = 0;
      
      for (int i = 0; i < tal.Length; i++)
      {
          if (tal[i] % 3 == 0)
          {
              summa += tal[i];
              k++; // count number of summed.
          }
      }
      
      double average = 0;
      
      if(k != 0) // prevent division by zero
      {
          average = (double)summa/k; // cast to double to hold precision.
      }
      
      Console.WriteLine(average);
      

      【讨论】:

        【解决方案5】:

        我会使用List&lt;int&gt;,您可以填写for-loop。然后你可以使用List&lt;T&gt;.ToArray(不是LINQ)来创建最终的int[]

        List<int> numbers = new List<int>();
        decimal sum = 0;
        for (int i = 500; i <= 1500; i++)
        {
            bool divisibleBy3 = i % 3 == 0;
            if (divisibleBy3)
            {
                numbers.Add(i);
                sum += i;
            }
        }
        decimal average = 0m;
        if (numbers.Count > 0)
            average = sum / numbers.Count;
        int[] result = numbers.ToArray();
        

        如果您不能使用任何 .NET 方法,您可以在循环中填写您的 int[]

        int[] result = new int[numbers.Count];
        for (int i = 0; i < numbers.Count; i++)
            result[i] = numbers[i];
        

        【讨论】:

        • 我想使用数组而不是列表
        • @AlexanderHalef:我正在使用一个数组。查看介绍性短语和我的代码的最后一行。您事先不知道该集合将包含多少项目,那么我总是更喜欢一个列表。 list.ToArray 是一个 O(n) 操作,因此非常有效。
        • @AlexanderHalef:但是,我添加了一种无需 .NET 方法即可初始化数组的方法。
        【解决方案6】:

        对于数组生成你可以使用int[] tal = Enumerable.Range(500, 1000).ToArray(); 逻辑可以保持不变

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-27
          • 1970-01-01
          • 2014-12-19
          • 2014-10-02
          • 2014-02-20
          相关资源
          最近更新 更多