首页 > 解决方案 > 获取列表中的项目从索引,但循环列表

问题描述

如果我有清单

List<string> fruits = new List<string>(){"apple", "pear", "banana"}

我怎么能改变

int i = 0;
while(true)
{
    Console.WriteLine(fruits[i]);
    i++;
}

输出

apple
pear
banana
apple
pear
banana
...

一旦我们到达列表的末尾,而不是使索引超出范围异常?

在我的实际代码中,我有数百个不同大小的列表。我有一个定时器,它定期调用一个方法,该方法需要从每个列表中返回一个值,以确保最终每个列表中的所有项目都以同样的频率返回。

因为i最终会变得很大,所以下面的解决方案不是最优的。

int i = 0;
while(true)
{
    int a = i;
    while(a > fruits.Count)
    {
        a -= fruits.Count;
    }
    Console.WriteLine(fruits[a]);
}

这是我需要修复的实际代码:

private static int _purgeNumber;
private static async Task<List<AutopurgeRow>> GetRowsToPurgeAsync()
{
    List<AutopurgeRow> rows = await Database.Data.Autopurge.GetRowsAsync(enabledOnly: true);

    List<AutopurgeRow> rowsToPurge = new List<AutopurgeRow>();
        foreach (SocketGuild guild in _client.Guilds)
        {
            if (rowsToPurge.Count(x => x.GuildId == guild.Id) == 0)
            {
                List<AutopurgeRow> guildRows = rows.Where(x => x.GuildId == guild.Id).OrderBy(x => x.ChannelId).ToList();
                AutopurgeRow row = guildRows[_purgeNumber % guildRows.Count];
                rowsToPurge.Add(row);
            }
        _purgeNumber++;
        if (_purgeNumber == int.MaxValue) _purgeNumber = 0;
    }

    return rowsToPurge;
}

标签: c#linq

解决方案


int a = i;
while (a > fruits.Count)
{
    a -= fruits.Count;
}

一种更有效的方法(并且更正确,因为>应该是>=)是在除以运算符时取余i数:fruits.Count%

int a = i % fruits.Count;

推荐阅读