2010-11-12 55 views
7

問候!如何在LINQ中做一個'搜索最佳'功能?

我正在尋找一種方法來搜索最符合我的標準的對象的集合。由於我必須經常這樣做,所以我一直在研究如何使用LINQ執行查詢,但找不到一個簡單的方法來做到這一點,不會浪費時間。

的功能的實現是:

collection.OrderByDescending(f => FitFunction(f)).First()

但這似乎不必要進行排序。我真的只需要線性掃描。 Min LINQ函數返回最佳擬合,而不是產生最佳擬合的對象,因此看起來不太有用。

爲了清楚起見,非LINQ代碼,我會寫的傳統(和已經這樣做了這麼多次):

T best; 
float bestFit = something very low; 

foreach (T ob in collection) 
{ 
    float fit = FitFunction(ob); 
    if (fit > bestFit) 
    { 
    bestFit = fit; 
    best = ob; 
    } 
} 
return best; 

而且我覺得我可能只是做我自己的擴展方法來做到這一點;但在我看來,LINQ中已經有一種方法可以做到這一點。

謝謝!

+0

而不是將'ob'對象傳遞給'FitFunction',你不能將'FitFunction'的結果作爲'ob'的一個屬性,因此啓用'collection.Min(t => t.FitValue )'? – vlad 2010-11-12 20:45:28

+0

@vlad:不幸的是,Enumerable.Min()方法返回最小值投影...而不是對象實例't',這是OP正在尋找的東西。這就是MoreLINQ引入MinBy和MaxBy操作符的原因。 – LBushkin 2010-11-12 20:52:02

+0

困難在於Min函數會產生't.FitValue',而不是't'。除此之外,這必然將FitValue綁定到對象,我將避免保持代碼鬆散耦合。 – 2010-11-12 20:52:37

回答

7

這主要是基於與附加約束N個總是等於1不幸的是,謂詞TOPN問題,沒有內置的LINQ運算符執行TOPN()操作...但正如你所指出的那樣,自己寫一個並不難。

MoreLINQ庫有一個MaxBy()運算符的實現,它允許你指定一個謂詞 - 也可以工作。

+0

Reactive Extensions(Rx)附帶的'System.Interactive'程序集也有'MaxBy'的實現。 http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx – bdukes 2010-11-12 21:31:07