我正在尋找一種方法來搜索最符合我的標準的對象的集合。由於我必須經常這樣做,所以我一直在研究如何使用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中已經有一種方法可以做到這一點。
謝謝!
而不是將'ob'對象傳遞給'FitFunction',你不能將'FitFunction'的結果作爲'ob'的一個屬性,因此啓用'collection.Min(t => t.FitValue )'? – vlad 2010-11-12 20:45:28
@vlad:不幸的是,Enumerable.Min()方法返回最小值投影...而不是對象實例't',這是OP正在尋找的東西。這就是MoreLINQ引入MinBy和MaxBy操作符的原因。 – LBushkin 2010-11-12 20:52:02
困難在於Min函數會產生't.FitValue',而不是't'。除此之外,這必然將FitValue綁定到對象,我將避免保持代碼鬆散耦合。 – 2010-11-12 20:52:37