Если бы у меня был список
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;
}
i = (i + 1) % fruits.Count
«Решение должно работать с несколькими списками разного размера» — не совсем понятно, что вы имеете в виду. Можете ли вы отредактировать свой вопрос, включив в него пример кода, демонстрирующий вашу реальную проблему, а не использовать более простой пример кода и расплывчатое утверждение о том, насколько ваша реальная проблема сложнее?
почему вы не используете цикл for?
@canton7 Приношу свои извинения, я отредактировал, чтобы было понятнее.
Все еще недостаточно ясно, предоставьте пример кода вашего случая
@ 230Daniel Итак, если у вас есть несколько списков, не заставляйте все примеры использовать один список, потому что все, что мы можем предположить, это то, что у вас есть разные списки, которые передаются одному методу.
Хорошо, в вашем реальном коде вы уже используете %
вместо цикла while. Есть ли еще конкретный баг? (Возможно, вам следует перейти к описанию общей проблемы и спрашивать о наилучшем способе ее решения в любом случае.)
@Ry- Да. Мне удалось убедить себя, что метод % почему-то не работает. Код, с которым у меня возникли проблемы, является более сложной версией приведенного выше, но он должен работать очень похожим образом. Я только что протестировал базовый код выше, и он работал отлично, я полагаю, что у меня должна быть какая-то другая странная ошибка, которую я могу найти. Спасибо за ответ, это будет полезно для других, столкнувшихся с этим.
int a = i; while (a > fruits.Count) { a -= fruits.Count; }
Более эффективный способ сделать это (и более правильный, поскольку >
должен быть >=
) — взять остаток от деления i
на fruits.Count
с помощью оператора %
:
int a = i % fruits.Count;
@CamiloTerevinto Как указано в моем вопросе, он должен работать с несколькими списками с одним значением i.