class Program
{
static void Main(string[] args)
{
var numbers = new[] {1, -1, -2, 3.5, 1.1, -0.1, 2, 5.7, 8, 9, -10, -2};
Func<double, bool> positiveIntegerSelector = x =>
{
if(x < 0)
return false;
var temp = (int) x;
return temp == x;
};
Func<double, bool> negativeIntegerSelector = x =>
{
if(x >= 0)
return false;
var temp = (int) x;
return temp == x;
};
var positiveIntegers = numbers.Where(positiveIntegerSelector); //unable to step in
var negativeIntegers = numbers.Where(negativeIntegerSelector);
Console.WriteLine(String.Join(",", positiveIntegers.Select(x => x.ToString()).ToArray()));
Console.WriteLine(String.Join("," , negativeIntegers.Select(x => x.ToString()).ToArray()));
}
}
这里缺少什么? (断点除外)
请注意它调试很好,否则除了我无法介入的谓词。
道歉是一个绝对的傻瓜 - &gt; stepout shift + F11(当谓词被指定为方法组/委托时)
当谓词被指定为lambda表达式时,步骤正常工作 x =&gt; positiveIntegerSelector(x)然后可以在lambda表达式中的谓词上指定break pt
答案 0 :(得分:1)
您需要在谓词中放置一个断点来调试它
你不能直接“插入”(我的机器上的 F11 )谓词,因为调用谓词的代码不是你的代码,而是在Enumerable.Where
内创建的代码,将在您迭代结果后立即执行。在您的情况下,这些是String.Join
调用的行
简而言之:执行这些谓词的是.NET框架代码。
答案 1 :(得分:1)
你什么时候想进入谓词?不要忘记,当您致电Where
时,当时没有执行任何过滤 - 它只会创建一个对象来表示过滤后的序列。如果您希望能够在Where
电话上点击F11,那么您肯定不会到达您的谓词。
我刚刚在Visual C#Express 2010中尝试了这一点,在每个lambda表达式的第一个语句上设置了一个断点,它在程序的最后两行中运行谓词时没有遇到任何问题。我希望VS2008也能如此。