2008-12-29 303 views
1

我在這個問題上看到LINQy way to check if any objects in a collection have the same property value有一個請求說如何使用LINQ來查看屬性是否與集合匹配。但是,這是做這件事的最合理的過程嗎?我將部署需要一定量資源管理的事物,並且我希望應用程序能夠儘可能快速地響應,而不會使代碼在其他人或我以後再回來時非常難以破譯。檢查一個集合中是否存在一個對象(T)

回答

2

然而,這是最快的合理的過程來做到這一點?

我猜的快捷方式(也許是最快的方法)來做到這一點可能是添加的所有對象到詞典或HashSet的,使用屬性作爲主鍵字段:像HashSet的方法。添加有一個返回代碼告訴你這個屬性值是否已經被添加。例如:

static bool containsDuplicate(Container<Foo> fooCollection) 
{ 
    //create the hash set 
    HashSet<Bar> hashSet = new HashSet<Bar>(); 
    //for each object to be tested 
    foreach (Foo foo in fooCollection) 
    { 
     //get the interesting object property 
     Bar propertyValue = fooCollection.bar; 
     //see whather we've already seen this property value 
     if (!hashSet.Add(propertyValue)) 
     { 
      //duplicate detected 
      return true; 
     } 
    } 
    //no duplicate detected 
    return false; 
} 
1

LINQ幾乎從來都不是最快的方式(根據原始執行時間)做任何事情。

雖然它通常「足夠快」。當你有一個單元測試的工作應用程序,你可以分析它,看看你是否需要優化。

「我們應該忘記小效率,大約97%的時間:過早優化是萬惡之源。」 -Donald Knuth

0

確實,LINQ會正常工作。當然,如果您知道可以在特定情況下優化情況,那麼您可以隨時爲更具體的類型編寫自己的LINQ擴展方法。由於類型爲更具特異性,因此應優先使用您自己的方法,而不是默認的Enumerable之一。這是不錯的; -p

0

這實際上取決於您的收集數據量和執行此操作的頻率。屬性的Linq搜索必須讀取集合中的每個項目/屬性。

如果你的集合中只有10個物品,而且這個操作每秒只能執行一次,那麼只有一次掃描才能找到物品屬性的速度相當快。

如果您的集合中有1,000萬個物品,那麼只需轉發或需要執行此類操作100次,那麼您可能需要此屬性的一些索引。

如果事實證明你需要索引這個,我會建議把這個邏輯封裝在一個對象中。因此,例如添加一個Item將它添加到主集合中,並在一個散列集合中添加一個屬性索引器。

相關問題