c# - 获取列表中的项目从索引,但循环列表
问题描述
如果我有清单
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;
}
解决方案
int a = i; while (a > fruits.Count) { a -= fruits.Count; }
一种更有效的方法(并且更正确,因为>
应该是>=
)是在除以运算符时取余i
数:fruits.Count
%
int a = i % fruits.Count;
推荐阅读
- python - 在 Pandas 中将原始日期转换为年/月/星期几
- android - Flutter 如何在无状态小部件中使用生命周期事件?应用关闭
- firebase - 尝试通过 cfhttp post 发送到 Firebase FCM
- reactjs - useState Reactjs 没有更新
- php - Laravel 嵌套查询
- java - Java(Android)中的FileObserver多次触发
- image - PrestaShop 1.7.6 图像在打开友好 URL 时不显示
- forms - 仅在选中另一个下拉菜单时才使下拉选项可单击
- php - 如何对客户端系统上发现的这种潜在 PHP 恶意软件进行去混淆处理?
- makefile - Makefile 变量扩展未按预期工作