我正在搜索某个对象中的 .Where()、.All 或至少一个其他“特殊”方法的代码。我想学习如何写这样的,因为我发现它们很有用。
还有一个问题 - 为什么有些对象包含这些方法而其他对象不包含,例如,我如何在我的类中继承它们?
我正在搜索某个对象中的 .Where()、.All 或至少一个其他“特殊”方法的代码。我想学习如何写这样的,因为我发现它们很有用。
还有一个问题 - 为什么有些对象包含这些方法而其他对象不包含,例如,我如何在我的类中继承它们?
Jon在Reimplementing LINQ to Objects中详细介绍了这一点;“哪里”是第 2 部分;“全部”是第 10 部分
对于“为什么有些对象包含这些方法而其他对象不包含这些方法,例如,我如何在我的类中继承它们?” - 标准 LINQ 操作被定义为IEnumerable<T>
和(单独)上的扩展方法IQueryable<T>
。如果您愿意,您可以在自己的类型上编写自己的扩展方法 - 或者只是常规的实例方法。
一个非常基本的实现Where
是通过一个迭代器块;Any
只是一种常规方法:
public static class SomeUtilityClass {
public static IEnumerable<T> Where<T>(
this IEnumerable<T> source, Func<T,bool> predicate)
{
foreach(var item in source)
{
if(predicate(item)) yield return item;
}
}
public static bool All<T>(
this IEnumerable<T> source, Func<T,bool> predicate)
{
foreach(var item in source)
{
if(!predicate(item)) return false;
}
return true;
}
}
您可能想编写一个 LINQ 提供程序;这是一种实现 LINQ 功能的类,例如 Where()、Select() 等。
但是你为什么需要它?如果您使用 LINQ to Objects,基本上您构建的任何集合都支持 LINQ。
无论哪种方式,要了解有关构建 LINQ 提供程序的更多信息,请查看http://msdn.microsoft.com/en-us/library/bb546158.aspx上的演练文章。
这是另一个有趣的链接,就在 Stack Overflow 上:Implementing your own LINQ & IEnumerable<T>
祝你好运!
另一种方法是下载 ILSpy 工具并打开一个实现这些扩展的 DLL。
例如,只需在 ILSpy 中打开 System.Linq 即可显示许多标准实现。