如何保留列表的最新X元素

时间:2012-11-28 22:31:29

标签: c# arrays collections

我需要使用一个数据结构来保存列表的最新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;
            }
        }

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

这很好,但在现实世界中很难使用它。有更简单的方法吗?

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

更容易实现此目的:

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

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

答案 2 :(得分:0)

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

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();