熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

c#擴展方法奇思妙用基礎篇六:WhereIf 擴展

2013-11-13 09:49:08  來源: .NET編程 

  一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 命名空間中隨時使用更方便


From:http://tw.wingwit.com/Article/program/net/201311/11659.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.