C#体贴之处点滴 - 如果打算写一个类似System.Linq.Enumerable.Where的extention method
2011-10-26 08:04
781 查看
说的是C#如何体贴程序员,而非.NET Framework。
如果打算写一个类似System.Linq.Enumerable.Where的extention method,假设命名为Filter,下面是C#为满足此需求下的功夫:
public static IEnumerable<T> Filter<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
if (source == null || predicate == null)
{
throw new ArgumentNullException();
}
return impl(source, predicate);
}
private static IEnumerable<T> impl<T>(IEnumerable<T> source, Func<T, bool> predicate)
{
foreach (T item in source)
{
if (predicate(item))
{
yield return item;
}
}
}
如果不依赖C#的语言糖衣,即上面的二个黑体关键字,纯粹依赖于framework来实现,就得费不少牛劲了。瞎猜一下,如果没有C#的体贴,也就不会有众多精彩纷呈的Linq Provider了!
下面是使用Filter的示例代码,Filter完全等价于Where!而且IDE Intellisense会识别到Filter, 如何,体贴不?
List<Product> products = Product.GetSampleProducts();
foreach (Product product in products.Filter(p => p.Weight > 0)) //可以换成Where
{
Console.WriteLine (product);
}
如果打算写一个类似System.Linq.Enumerable.Where的extention method,假设命名为Filter,下面是C#为满足此需求下的功夫:
public static IEnumerable<T> Filter<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
if (source == null || predicate == null)
{
throw new ArgumentNullException();
}
return impl(source, predicate);
}
private static IEnumerable<T> impl<T>(IEnumerable<T> source, Func<T, bool> predicate)
{
foreach (T item in source)
{
if (predicate(item))
{
yield return item;
}
}
}
如果不依赖C#的语言糖衣,即上面的二个黑体关键字,纯粹依赖于framework来实现,就得费不少牛劲了。瞎猜一下,如果没有C#的体贴,也就不会有众多精彩纷呈的Linq Provider了!
下面是使用Filter的示例代码,Filter完全等价于Where!而且IDE Intellisense会识别到Filter, 如何,体贴不?
List<Product> products = Product.GetSampleProducts();
foreach (Product product in products.Filter(p => p.Weight > 0)) //可以换成Where
{
Console.WriteLine (product);
}
相关文章推荐
- 在使用Linq to SQL并序列化一个数据对象的时候报System.InvalidOperationException异常,序列化类型XXX的对象时检测到循环引用。
- C#中一个类似inputBox的输入框(转)
- 分享一个简单的资源管理器程序,主要是演示下LINQ在C#开发中的运用
- 分享一个C#实现的迷宫生成程序,继续演示LINQ语法在C#中的运用
- (一)边做边发表--产销系统之需求分析--------------最近准备在博客上边做边发表一个oa系统,如果做的烂读者别见笑,暂定产销系统asp.net 2.0(C#)+sql2000(b/s)
- 用c#开发一个类似AutoCAD功能的程序
- C#: 自己写的一个类似BackGroundWorker的类
- C# Array 中的 Linq 方法 Where Count Select
- C#: from in select ; m(linq where)
- 解决 System.IO.FileNotFoundException: 未能加载文件或程序集“Team.DLinqDAL”或它的某一个依赖项。系统找不到指定的文件。
- linq之where用法.(补充where的别一个用法)
- 在Unity3D中用C#封装一个类似AS3的ByteArray类
- c# Linq Where 抛出异常 导致 程序崩溃
- FCL研究-LINQ-System.Linq Enumerable
- C#体贴之处点滴 - Finalizer
- C# IEnumerable<T> 使用了 Where 后 foreach 变慢
- c#输入一个字符串,并把字符串的第一个字符变为大写,如果字符串中有空格则把空格的下个字符变为大写之后输出
- linq 查询 实现如果条件为空则加where,否则不加Where的效果
- 在Unity3D中用C#封装一个类似AS3的ByteArray类(二)--升级版
- c# linq.Where+Func<object,bool>筛选数据