Linq.Max InvalidOperationException(结果中没有元素)

时间:2015-05-05 13:49:01

标签: c# linq

我有一个代码:

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如何才为空; ?

2 个答案:

答案 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'作为一种好习惯。