【问题标题】:How to keep the latest X elements of a list如何保留列表的最新 X 元素
【发布时间】:2012-11-28 22:31:28
【问题描述】:

我需要使用一种数据结构来保留列表中最新的 X 元素。一位同事给了我这个解决方案:

        int start = 0;
        const int latestElementsToKeep = 20;
        int[] numbers = new int[latestElementsToKeep];
        for (int i = 0; i < 30; i++)
        {
            numbers[start] = i;
            if (start < numbers.Length - 1)
            {
                start++;
            }
            else
            {
                start = 0;
            }
        }

所以运行后,numbers 数组的数字为 19-29(最新的 20 个数字)。

这很好,但很难在现实世界中使用它。有没有更简单的方法来做到这一点?

【问题讨论】:

  • 19-29 是最后 10 个数字,打错了吗?
  • 您想对这些集合执行哪些操作?
  • 我需要非常频繁地处理列表,所以我想限制自己实时发生的最新X元素。
  • @TravisJ: 19-29 实际上是最后 11 个数字...

标签: c# arrays collections


【解决方案1】:

这似乎是一个相当标准的Circular Buffer。我唯一的建议是为它创建一个类或下载一个可用的库。在 Google 搜索结果的顶部附近似乎有一些看起来很有希望的搜索结果。

【讨论】:

    【解决方案2】:

    更简单的方法:

    int[] numbers = new int[latestElementsToKeep];
    for (int i = 0; i < 30; i++)
        numbers[i % latestElementsToKeep] = i;
    

    Modulus operator 返回将i 除以latestElementsToKeep 的提示。当i 到达latestElementsToKeep 时,您将从头开始。

    【讨论】:

      【解决方案3】:

      对于一系列数字,您可以使用:

      int keep = 20;
      int lastItem = 29;
      int[] numbers = Enumerable.Range(lastItem - keep, keep).ToArray();
      

      要从任何集合中获取最后一个项目(您可以在其中获取大小),您可以使用:

      int keep = 20;
      someType[] items = someCollection.Skip(someCollection.Count() - keep).ToArray();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-21
        • 1970-01-01
        • 2020-12-24
        • 1970-01-01
        • 2022-12-07
        • 1970-01-01
        • 2019-05-03
        相关资源
        最近更新 更多