像jeroenh實現,你需要捕獲原始索引。您傳遞的Funct<T,int,bool>
條件只需要知道該項目及其索引,而不是在查詢中創建的匿名類型,因此傳遞的條件會發生一些變化。它也應該處理索引== 0並因此沒有前面項目(索引-1)的情況。
class Program {
static void Main(string[] args) {
var items = Item.GetItems();
// mind the case where index == 0 so you don't grab an item out of bounds
var ind = GetIndices(items,
(p, index) => (h.index == 0) ? false : p.Height < items[ index - 1 ].Height);
}
static List<int> GetIndices<T>(List<T> list, Func<T, int, bool> condition) {
var res = list
.Select((item, index) => new { item, index }) // capture original index
.Where(h => condition(h.item, h.index))
.Select(h => h.index); // reduce to the index again
return res.ToList();
}
}
class Item {
public int Height {
get;
set;
}
public Item(int h) {
Height = h;
}
static public List<Item> GetItems() {
return new List<Item>(new[]{
new Item(1),
new Item(4),
new Item(2),
new Item(5)
});
}
}
這應該工作,與小警告,如果'someList'大你可能已經在這裏推出了性能問題('IndexOf'是O(N)操作) – jeroenh 2011-05-11 15:04:46