2009-11-13 33 views
5

如何才能找到第一個值在Dictionary<int, MyTableClass>其中MyTableClass繼承Field<F1, F2, F3>?我更喜歡屬性或屬性/方法組合,它返回字典中的第一個值F1 = MyEnum.value。我不想做的是foreach。在性能方面,這實在不是一個首選的方法。如何在字典中查找'第一個'值?

+4

性能方面,你可以在這裏做的任何事情 - LINQ等 - 不會比'foreach'快,因爲你沒有對字典鍵進行查找。只有密鑰查找速度快;對於其他任何事情,你必須做一個線性掃描(或爲另一個鍵維護第二個字典,這將是你做任何查找)。 – 2009-11-13 20:33:55

+0

@Pavel:哇...我在近2年中學到了很多東西。我希望我知道我現在知道的。 – IAbstract 2011-08-17 23:14:15

回答

6

無論你如何在這裏打扮,你基本上必須做一個foreach超過Dictionary的值。 A Dictionary<TKey,TValue>提供了接近於O(1)訪問全鍵到給定值。它的目的不是爲了提供對部分密鑰的有效訪問。爲了得到您需要保留第二個Dictionary實例進行適當的映射。

2

您可以使用.First()擴展方法。

+0

。第一次()什麼? Dictionary obj上沒有這樣的方法。 – 2016-09-29 08:42:26

+0

將幫助,如果您可以添加更多的上下文到您的答案 – 2016-09-29 08:42:55

+0

這是一種擴展方法,所以你只有當你導入System.Linq – maxpower47 2016-09-29 15:41:46

6

查找符合某些條件的值的最短途徑(我無法完全理解您想要的具體內容 - 首先F1是一個泛型類型參數,然後使用==將其作爲一個值進行比較.. )是做到這一點:

dictionary.Values.First(x => ...); 

其中...將在x一個布爾表達式。但是,這不會比foreach...更快,因爲您沒有對字典鍵進行查找。只有密鑰查找速度快;對於其他任何事情,你必須做一個線性掃描(或爲另一個鍵維護第二個字典,這將是你做任何查找)。

5

字典沒有在元素之間保持任何特定的順序,所以沒有任何元素可以作爲第一個元素,除非你指定了一些順序。

你可以得到字典碰巧找到這樣的第一個項目:

MyTableClass one = dict.Where(pair => pair.Value.F1 == MyEnum.value).First(); 

這隻會通過項目循環,直到它找到一個匹配,所以你只是用字典爲列表。如果你想要任何表演,你應該有一本字典,其中F1的值是關鍵。

+0

謝謝大家的答案。我非常確定,foreach將是唯一能夠做我想做的事情的方法 - 但只是想看看有沒有人想過我的想法...... :) – IAbstract 2009-11-17 16:51:46

相關問題