gpt4 book ai didi

c# - 了解 LINQ 中的执行

转载 作者:行者123 更新时间:2023-11-30 15:34:47 24 4
gpt4 key购买 nike

我有以下产品列表

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)

但是在我调试时的结果 View 中,我看到了 veges1 的输出。

如果我点击下面的代码

veges1.Count()   // Breakpoint in Predicate and GET is hit and i got the count value.

这是如何运作的?能不能给点理解。

PS:我知道有很多例子和问题。我试图通过这个例子来理解,因为它会让我更容易得到东西。

更新问题

我在上面做的相同示例正在尝试对 Lamda 表达式做同样的事情

var veges4 = products.Get(p => p.ProductName.Contains("vegetable"));

我得到了预期的结果。

GET 是我的扩展方法,但是当执行该行时,我从未调用 GET 方法上的断点?

谢谢

最佳答案

当使用 yield return item; 时,你返回一个 Enumerator,所以你应该这样做:

foreach (var item in products.Get(IsVege))
{...}

或使用 .ToList() 扩展方法,该方法将为您执行 foreach 循环并返回项目列表。但是通过编写以下代码:

var item = products.Get(IsVege);

您刚刚收到用于遍历所需集合的正确枚举器。

有关如何调试 yield return 代码的良好引用,请参阅:What is the yield keyword used for in C#?

public void Consumer()
{
foreach(int i in Integers())
{
Console.WriteLine(i.ToString());
}
}

public IEnumerable<int> Integers()
{
yield return 1;
yield return 2;
yield return 4;
yield return 8;
yield return 16;
yield return 16777216;
}

关于c# - 了解 LINQ 中的执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15781552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com