为什么仅返回1条记录时,ToList会引发异常

时间:2019-04-10 18:15:23

标签: c# linq

我有一个lambda表达式,用于查找表单中包含特定方法名称的所有标签(标签是动态创建的,并包含前缀和方法名称)。该表达式删除前缀,并评估剩下的内容是否与方法名称匹配。一切运行良好,直到遇到一个只返回一个标签的方法。当它碰到这一行时:

var labels = methodLabels
    .Where(t => t.Name.Remove(0, t.Name.IndexOf(d.Name)) == d.Name)
    .ToList();

它引发异常“计数不能小于零。 参数名称:count”。但是,如果我将ToList()更改为FirstOrDefault(),则可以正常工作并返回正确的标签。这在foreach循环中:

foreach (var d in remainingMethods)
{
    var labels = methodLabels.Where(t => t.Name.Remove(0, t.Name.IndexOf(d.Name)) == d.Name).ToList();

    foreach (var l in labels)

我在网上找不到任何可以解决我的问题的东西。如果有人知道为什么会这样,或者可以帮助您解决,我将不胜感激。我不能只是将其更改为FirstOrDefault(),以防查询返回多条记录。非常感谢您的协助。

3 个答案:

答案 0 :(得分:3)

您的异常"Count cannot be less than zero. Parameter name: count".引用了String.Remove方法中的第二个参数。当您的字符串中未找到方法名称时,IndexOf可能返回负1。由于在lambda中使用remove实际上不允许您返回删除了前缀的列表,因此您可以考虑简单地使用String.Contains。但是,如果范围太广并且可能返回假阳性,则可以更新当前检查以适应找不到方法名称的情况。

var labels = methodLabels
    .Where(t => t.Name.Remove(0, Math.Max(0,t.Name.IndexOf(d.Name))) == d.Name)
    .ToList();

答案 1 :(得分:0)

我的猜测是错误来自Remove方法调用,因为IndexOf方法为-1中的一项返回methodLabels作为其{ {1}} 不包含Name中的值。

Camilo Terevinto所述,当您执行d.Name时,它将返回与您的FirstOrDefault谓词相匹配的第一个,并停止处理Where中的下一个项目;但是当您执行methodLabels时,它会遍历ToList中所有所有项,并且其中一项会引发错误。

请参阅String.Remove的文档

  

例外   ArgumentOutOfRangeExceptionmethodLabels都小于零。

答案 2 :(得分:0)

这行吗?

var labels = methodLabels
    .Where(t => t.Name.Remove(0, Math.Max(0, t.Name.IndexOf(d.Name))) == d.Name)
    .ToList();