2010-02-05 44 views
8

我想有以下API的方法:接受謂詞的C#方法 - 這看起來好嗎?

//get all users with a role of admin 
var users = myRepository.GetUsers(u => u.Role == Role.Admin); 

請問像這樣的工作?

IList<User> GetUsers(Func<User, bool> predicate) 
{    
    var users = GetAllUsers(); 
    return users.Where(predicate).ToList();               
} 

如果是這樣,我西港島線能夠指定更復雜的謂語,如():

myRepository.GetUsers(u => u.CreatedDate is upto 14 days old); 
+1

爲什麼你不想返回一個IEnumerable的用戶? – 2010-02-05 11:46:31

+0

IEnumerable是否可取,因爲它更靈活? – Ben 2010-02-05 12:05:02

+1

一個IList是一個IEnumerable,所以IEnumerable的靈活性會降低。我認爲這個評論可能是針對可能不需要的ToList()的調用? – 2010-02-05 17:50:25

回答

19

看起來非常好。但是,如果你想使用的謂詞類似的LINQ to SQL,你想使用:

IList<User> GetUsers(Expression<Func<User, bool>> predicate) 

這意味着lambda表達式將被轉換成一個表達式樹,而不是一個委託 - 那表情樹可以被轉換成SQL。

+0

非常感謝您的回覆。謝謝 – Ben 2010-02-05 12:04:21

+2

+1這個解釋澄清了我對LINQ的理解百分之幾。多謝。 :) – 2011-01-22 00:28:32

+0

非常感謝這個答案。我正在使用LINQ to SQL,並且僅使用Func 會引發OutOfMemory異常。這工作完美。 – AngieM 2016-08-24 20:10:37

3

是的,這會工作。

什麼你告訴編譯器,你要通過一個User對象上工作的功能,並返回一個bool - 功能樣子完全取決於你。您可以使用ors(||)和ands(&&)獲得非常複雜的嵌套內容,但是如果太難了解謂詞在做什麼,那麼您應該考慮重構。

但基本上任何lambda需要例如u作爲User對象,並將其轉換爲返回bool的表達式。

2

一個建議:你可以使用謂詞<牛逼>而不是Func鍵< T,布爾>,這是一個更清晰一點(謂語<牛逼>內置於.NET 3.5,命名空間系統)。

+2

'Predicate '實際上是在.NET 2.0中,但'Func '傾向於在LINQ中使用 - 部分原因是某些方法具有'Func '。 – 2010-02-05 12:01:16

+0

啊,我忘了它是在2.0;你能給我一些使用Func 方法的例子嗎?謝謝 – ljs 2010-02-05 13:45:57