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