我有以下产品列表
List<Product> products = new List<Product> {
new Product {
ProductID = 1,
ProductName = "first candy",
UnitPrice = (decimal)10.0 },
new Product {
ProductID = 2,
ProductName = "second candy",
UnitPrice = (decimal)35.0 },
new Product {
ProductID = 3,
ProductName = "first vegetable",
UnitPrice = (decimal)6.0 },
new Product {
ProductID = 4,
ProductName = "second vegetable",
UnitPrice = (decimal)15.0 },
new Product {
ProductID = 5,
ProductName = "third product",
UnitPrice = (decimal)55.0 }
};
var veges1 = products.Get(IsVege); //Get is a Extension method and IsVege is a Predicate
//Predicate
public static bool IsVege(Product p)
{
return p.ProductName.Contains("vegetable");
}
//Extension Method
public static IEnumerable<T> Get<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
foreach (T item in source)
{
if (predicate(item))
yield return item;
}
}
我知道在这些主题上已经很晚了,但仍然试图通过在 Visual Studio 中调试来理解
我在所有函数中都有断点(谓词,扩展方法)
我的问题是
1.当下面的行被执行时会发生什么
var veges1 = products.Get(IsVege); // i dont see the breakpoint hitting either predicate or GET method)
但是在调试时的结果视图中,我看到了 veges1 的输出。
如果我点击下面的代码
veges1.Count() // Breakpoint in Predicate and GET is hit and i got the count value.
这是如何运作的 ?能不能给点理解。
PS:我知道这有很多例子和问题。我试图用这个例子来理解,因为它会让我更容易得到东西。
更新的问题
我在上面做的同一个样本试图对 Lamda Expression 做同样的事情
var veges4 = products.Get(p => p.ProductName.Contains("vegetable"));
我得到了预期的结果。
其中 GET 是我的扩展方法,但是当执行该行时,我从未调用过 GET 方法上的断点?
谢谢