IEnumerable.ElementAt - 值存在时参数超出范围异常
IEnumerable.ElementAt - Argument Out Of Range Exception when Value Exists
我有这段代码从列表的计数 (-1) 中获取一个随机数,然后获取该索引处的元素。然后我从该列表中删除该对象并调用代码,直到所有对象都从该列表中消失。
我有点困惑怎么会有 13 个索引 (0-12) 而我用来获取元素的整数是 11。这怎么会超出有效值的范围?
private Player GetRandomPlayer(List<Player> entries)
{
var rIdx = rnd.Next(entries.Count - 1);
var player = entries.Where(i => i.Seed == null).ElementAt(rIdx);
entries.Remove(player);
return player;
}
异常图片和测试用例:
包含 13 个值的列表:
https://ibb.co/wQdq1q4
包括用于获取值的 int 在内的异常:https://ibb.co/mJXwMFh
rIdx
的选择算大家;但不是 每个人 都会匹配谓词 i => i.Seed == null
。因此,如果有 13 名球员,其中 3 名非种子球员,而您选择球员 5... 繁荣。
修复:在计数之前应用谓词。
ElementAt()
方法适用于 Where
子句的 return 值。如果具有 Seed == null
的元素少于 rIdx+1
个,则会出现异常。
通过假设你想要实现的目标,我认为这应该可行:
// filter list
var nullEntries = entries.Where(i => i.Seed == null).ToList();
// use only filtered values
var rIdx = rnd.Next(nullEntries.Count - 1);
var player = nullEntries[rIdx];
entries.Remove(player);
我有这段代码从列表的计数 (-1) 中获取一个随机数,然后获取该索引处的元素。然后我从该列表中删除该对象并调用代码,直到所有对象都从该列表中消失。
我有点困惑怎么会有 13 个索引 (0-12) 而我用来获取元素的整数是 11。这怎么会超出有效值的范围?
private Player GetRandomPlayer(List<Player> entries)
{
var rIdx = rnd.Next(entries.Count - 1);
var player = entries.Where(i => i.Seed == null).ElementAt(rIdx);
entries.Remove(player);
return player;
}
异常图片和测试用例:
包含 13 个值的列表: https://ibb.co/wQdq1q4
包括用于获取值的 int 在内的异常:https://ibb.co/mJXwMFh
rIdx
的选择算大家;但不是 每个人 都会匹配谓词 i => i.Seed == null
。因此,如果有 13 名球员,其中 3 名非种子球员,而您选择球员 5... 繁荣。
修复:在计数之前应用谓词。
ElementAt()
方法适用于 Where
子句的 return 值。如果具有 Seed == null
的元素少于 rIdx+1
个,则会出现异常。
通过假设你想要实现的目标,我认为这应该可行:
// filter list
var nullEntries = entries.Where(i => i.Seed == null).ToList();
// use only filtered values
var rIdx = rnd.Next(nullEntries.Count - 1);
var player = nullEntries[rIdx];
entries.Remove(player);