扩展方法出现问题
本文关键字:问题 方法 扩展 | 更新日期: 2023-09-27 18:00:59
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace LambdaExtensionEx
{
class Program
{
static void Main(string[] args)
{
string[] myStrngs = new string[] { "Super","Simple","Okay"};
IEnumerable<string> criteraStrngs = myStrngs.WhereSearch<string>(delegate(string s)
{
return s.StartsWith("s");
});
string s1 = "dotnet";
int count = s1.GetCount();
Console.ReadLine();
}
}
public static class MyExtension
{
public delegate bool Criteria<T>(T Value);
public static IEnumerable<T> WhereSearch<T>(this IEnumerable<T> values, Criteria<T> critera)
{
foreach (T value in values)
if (critera(value))
yield return value;
}
public static int GetCount(this string value)
{
return value.Count();
}
}
}
我能够调用GetCount扩展方法,并在"count"中得到结果。但WhereSearch在任何时候都没有被调用,也没有得到结果。我犯了什么错误?
如果要执行WhereSearch
函数,则需要开始枚举它返回的结果。这是因为这个函数yield returns
是一个IEnumerable<T>
。C#编译器所做的是构建一个状态机,并且在调用代码开始枚举结果之前不会立即执行函数。
例如:
// The function is not executed at this stage because this function uses
// yield return to build an IEnumerable<T>
IEnumerable<string> criteraStrngs = myStrngs.WhereSearch<string>(delegate(string s)
{
return s.StartsWith("s");
});
// Here we start enumerating over the result => the code will start executing
// the function.
foreach (var item in criteraStrngs)
{
Console.WriteLine(item);
}
另一个例子是对结果调用一些LINQ扩展方法,如.ToList()
,它将实际枚举并调用函数:
IEnumerable<string> criteraStrngs = myStrngs.WhereSearch<string>(delegate(string s)
{
return s.StartsWith("s");
})
.ToList();
有关延迟加载在这种情况下如何工作的更多详细信息,您可以查看following post
。
您的扩展方法类没有多大意义——为什么不直接这样做呢?
class Program
{
static void Main(string[] args)
{
string[] myStrngs = new string[] { "Super", "Simple", "Okay" };
IEnumerable<string> criteraStrngs = myStrngs.Where(x => x.StartsWith("s"));
string s1 = "dotnet";
int count = s1.Count();
Console.ReadLine();
}
}
正如Darin Dimitrov之前所说的那样,你仍然需要枚举criteriaStrings才能得到结果,这就是你原始代码的问题所在。
HTH