我有一个代码:
var fullist = Enumerable.Where<CooldownRecord>(GetCooldowns(petskills), s => (spellId.Contains((uint)s.SpellId) || (SharedIds.Contains((uint)s.SharedId) && s.SharedId != 0)) && s.TimeLeft > 0);
if(fullist.Count() == 0) return 0;
return fullist.Max(s => s.TimeLeft);
大部分时间都有效。但有时它会在fullist.Max上抛出InvalidOperationException。我在这做错了什么?如果检查是否(fullist.Count()== 0)返回0,那么fullist如何才为空; ?
答案 0 :(得分:1)
如果查看documentation,如果输入序列为空,则会发现InvalidOperationException
被抛出。
如果它从第二行变为第三行,那就是可能的。
但我不会多次执行查询。您可以使用DefaultIfEmpty(0)
int maxTimeLeft = GetCooldowns(petskills)
.Where(s => (spellId.Contains((uint)s.SpellId) || SharedIds.Contains((uint)s.SharedId)) && s.SharedId != 0)) && s.TimeLeft > 0)
.Select(s => s.TimeLeft)
.DefaultIfEmpty(0)
.Max();
return maxTimeLeft;
答案 1 :(得分:0)
为了说明确切的错误,您应该分享更多详细信息,但您可以尝试:
return GetCooldowns(petskills).Where(s => (spellId.Contains((uint)s.SpellId) || (SharedIds.Contains((uint)s.SharedId) && s.SharedId != 0)) && s.TimeLeft > 0).Select(x => s.TimeLeft)
.DefaultIfEmpty(0)
.Max();
GetCooldowns(petskills)在任何情况下都不应该返回null。 你应该使用'fullist.Any()'而不是'fullist.Count()== 0'作为一种好习惯。