c#

位置:IT落伍者 >> c# >> 浏览文章

c#扩展方法奇思妙用基础篇六:WhereIf 扩展


发布日期:2024年04月11日
 
c#扩展方法奇思妙用基础篇六:WhereIf 扩展

Where 扩展的不足

如下界面可通过姓名编号和地址对人员进行模糊查询

我们通常会写出如下代码

public IQueryable<Person> Query(IQueryable<Person> source string name string code string address)

{

var result = source;

if(stringIsNullOrEmpty(name) == false)

result = sourceWhere(p => pNameContains(name))

if (stringIsNullOrEmpty(code) == false)

result = sourceWhere(p => pCodeContains(code))

if (stringIsNullOrEmpty(address) == false)

result = sourceWhere(p => pCodeContains(address))

return result;

}

以上代码有大量的 if 显得很繁琐代码可读性不好

创建并使用 WhereIf 扩展

WhereIf 扩展比较简单代码如下

public static IQueryable<T> WhereIf<T>(this IQueryable<T> source Expression<Func<T bool》 predicate bool condition)

{

return condition ? sourceWhere(predicate) : source;

}

上面的代码可简化成

public IQueryable<Person> Query(IQueryable<Person> source string name string code string address)

{

return source

WhereIf(p => pNameContains(name) stringIsNullOrEmpty(name) == false)

WhereIf(p => pCodeContains(code) stringIsNullOrEmpty(code) == false)

WhereIf(p => pCodeContains(address) stringIsNullOrEmpty(address) == false)

}

是不是更易读一些!

当然我们还需要一个 IEnumerable<T> 版本的 WhereIf 扩展方便对集合进行查询

public static IEnumerable<T> WhereIf<T>(this IEnumerable<T> source Func<T bool> predicate bool condition)

{

return condition ? sourceWhere(predicate) : source;

}

WhereIf 完整代码

namespace SystemLinq

{

public static class WhereIfExtension

{

public static IQueryable<T> WhereIf<T>(this IQueryable<T> source Expression<Func<T bool》 predicate bool condition)

{

return condition ? sourceWhere(predicate) : source;

}

public static IQueryable<T> WhereIf<T>(this IQueryable<T> source Expression<Func<T int bool》 predicate bool condition)

{

return condition ? sourceWhere(predicate) : source;

}

public static IEnumerable<T> WhereIf<T>(this IEnumerable<T> source Func<T bool> predicate bool condition)

{

return condition ? sourceWhere(predicate) : source;

}

public static IEnumerable<T> WhereIf<T>(this IEnumerable<T> source Func<T int bool> predicate bool condition)

{

return condition ? sourceWhere(predicate) : source;

}

}

}

将类放入 SystemLinq 命名空间中随时使用更方便

上一篇:.NET基础知识-什么是.NET

下一篇:Rational 面向 .NET 开发