2017-02-16 75 views
2

我有一個對象列表IEnumerable<Item>,讓我們稱之爲Items。項目有一個propoerty Item.Subitems這是一個子項目列表。清單約500個項目,每個平均10個子項目。c#對象列表過濾(linq?)

這些都是「內存」對象(在這個級別沒有數據庫查詢)。

我想有一個函數:

public static string GetSubitemValue(int id) 
{ 
    return Items.SelectMany(i => i.Subitems).FirstOrDefault(si => si.id == id).Value; 
} 

功能GetSubitemValue將多次調用一個過程調用(此操作系統剃刀局部視圖渲染處理)中(讓我們假設500)。

是否有任何內置linq增強功能可支持可重複列表搜索(迭代?)。我應該關心自己做一些緩存或索引嗎?

+1

首先,你應該問自己:它是否有任何影響,或者我是否過早優化?如果它*有影響,緩存項目一個Dictionary,HashMap或類似的東西。 –

+0

在你的情況下,我有一些建議:使用redis緩存或memcache。 –

+0

Thanks @Linh,但我無法在此級別擴展解決方案。我只能在視圖級別訪問模型(Razor)。項目列表是Model的一部分。 –

回答

4

據我所知,沒有內置的機制來增強多種排序。但是,您可以按如下方式實現緩存返回值。

private static Dictionary<int,string> Cache = new Dictionary<int,string>(); 

public static string GetSubitemValue(int id) 
{ 
    if (!Dictionary.Contains(id)) 
    { 
     Dictionary[id] 
      = Items.SelectMany(i => i.Subitems) 
        .FirstOrDefault(si => si.id == id).Value; 
    } 
    return Dictionary[id]; 
} 

但是請注意,你的初始代碼段將引發Items不包含所需的ID異常。