我有一个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(),以防查询返回多条记录。非常感谢您的协助。
答案 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
的文档
例外 ArgumentOutOfRangeException或
methodLabels
都小于零。
答案 2 :(得分:0)
这行吗?
var labels = methodLabels
.Where(t => t.Name.Remove(0, Math.Max(0, t.Name.IndexOf(d.Name))) == d.Name)
.ToList();