【问题标题】:filter results quarterly每季度筛选结果
【发布时间】:2010-06-15 15:26:24
【问题描述】:

我正在编写一个处理银行储蓄的简单 C# 应用程序。 我希望能够显示每年、每月或每季度的基本结果,如何做到这一点?例如,我如何遍历一组结果并仅显示每三个帖子(如果我使用季度)。

在 Python 中我可以使用 range(1,31,3),但它在 C# 中是如何完成的?

更新 1

我想循环 12 次(每年)并计算每个循环的利息,但我只想每第三个循环(每季度)打印一次结果。我怎样才能做到这一点?

【问题讨论】:

标签: c# filter


【解决方案1】:

我不确定我是否正确理解了这个问题,但如果你想每 3 天一次,你可以使用这个表达式:

Enumerable.Range(1, 31).Where(e => e % 3 == 0);

它返回以下值:

3 
6 
9 
12 
15 
18 
21 
24 
27 
30

编辑:

我想循环 12 次(每年)并且 计算每个循环的利息,但我 只想打印结果 第三个循环。我怎样才能做到这一点?

您可以简单地从 1 循环到 12,如果您想每 3 个循环打印一次,只需查看此示例。 sum 变量保存总计。

int sum=0;

foreach (int i in Enumerable.Range(1, 12))
{
    int tmp = i;
    sum += DoYourCalculation(tmp);
    if (tmp % 3 == 0)
    {
        Console.WriteLine(sum);
    }
}

【讨论】:

    【解决方案2】:

    只显示每三个项目?

    for (int i = startingItem; i < list.Count; i += 3)
    {
        // show list[i]
    }
    

    【讨论】:

      【解决方案3】:

      这可能最好在 SQL 中完成,假设您使用的是数据库,使用 WITH ROLLUP 或类似名称。

      【讨论】:

      • 我没有使用数据库,只有数组等。
      • @user339067 - 这将是您的第一个问题,不要使用数组和“此类”来存储银行储蓄账户信息。
      【解决方案4】:

      类似于Shimrod 所说的你可以这样做......

      var range = Enumerable.Range(1, 10).Select(x => x * 3);
      

      ...它的优点是不会创建您将要跳过的值。

      如果您想使用 LINQ 获得更多功能,您可以自己创建类似这样的东西(优点是可以处理无限的数字集 [几乎无限,这将使用 int,因此它会在 int.MaxValue 处溢出]。 ..

      public static class EnumerableCounters
      {
          public static IEnumerable<int> Counter()
          {
              return Counter(0);
          }
          public static IEnumerable<int> Counter(int offset)
          {
              return Counter(offset, 1);
          }
          public static IEnumerable<int> Counter(int offset, int step)
          {
              for (var x = offset; ; x += step)
                  yield return x;
          }
      }
      class Program
      {
          static void Main(string[] args)
          {
              var vals = EnumerableCounters.Counter(10, 3).Take(5).ToArray();
          }
      }
      

      【讨论】:

        【解决方案5】:

        由于您想要处理每个值,并且想要对每三个值执行一些特殊操作,因此您需要测试循环内的循环变量以检测该间隔。其他一些解决方案处理每三分之一的值,但不是每一个值的情况。像这样的事情应该做,根据需要替换您的实际逻辑 ProcessMonth 和 ProcessQuarter。

        for(int numMonth = 0; numMonth < 12; numMonth++)
        {
             ProcessMonth(balance[numMonths]);
             if ((numMonth + 1) % 3 == 0)
             {
                  ProcessQuarter(numMonth);
             }
        }
        

        【讨论】:

          【解决方案6】:

          你在这里没有给我们太多的工作......你有什么样的数据结构?数据库?一个列表?一个数组?

          您可以简单地循环执行此操作:

          for (int i = 1; i<= 12; i+=3) {...}
          

          假设您每个月有一条记录,这将每三个月发生一次。虽然,季度结果通常是过去 3 个月的sum,不是吗(嗯,可能比这更复杂)?因此,显示第 3 项可能还不够,您可能必须查看 3 项,显示该季度的总和,查看接下来的 3 项,显示总和等。 ..

          ...如果我对它更好,我会尝试使用 LINQ 的解决方案。 ;)

          编辑

          将数组中的 3 个数字相加并显示:

          int sum;
          for (int i =1; i<= 12; i+=3)
          {
              //just make sure you don't go beyond the bounds of your array!
              sum = someArray[i]+someArray[i+1]+someArray[i+2];
              Console.WriteLine(sum);
          }
          

          替代:

          int sum;
          for (int i =1; i<= 12; i++)
          {
              sum += someArray[i];
              if (i%3==0)
              {
                  Console.WriteLine(sum);
                  sum =0;
              }
          }
          

          ...还有很多其他方法可以做到这一点。我没有编译这些,所以我不能 100% 知道它们是你想要的,但它们应该让你走上正确的轨道。

          【讨论】:

          • “您可能需要检查 3 项,显示该季度的总和,然后检查接下来的 3 项,显示总和”。是的,这正是我需要的。这是怎么做到的?
          猜你喜欢
          • 2020-06-29
          • 1970-01-01
          • 1970-01-01
          • 2022-11-21
          • 1970-01-01
          • 2012-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多