2014-10-30 55 views
0

這個問題幾乎說明了一切。我有一個NameValueCollection,其中所有值都以空值開始,然後隨着事物的移動而設置爲特定值。每次設置值時,我都需要找到值爲!= null的集合中的項目數。目前我正在遍歷集合並計算非空值,但我想查找是否有辦法通過lambda表達式來實現它更乾淨。有沒有辦法使用lambda表達式在NameValueCollection中找到非空值

+0

這會幫助你? 'Collection.Count((i)=> i!= null?1:0)' – Icepickle 2014-10-30 20:49:33

+0

您不應該通過集合進行線性搜索來首先對項目進行計數。這是一個特別低效的算法。爲什麼你首先有一堆空條目? – Servy 2014-10-30 20:50:37

+0

'每次設置一個值/計數值的數量!= null' - 爲什麼你不緩存該值?如果您知道集合從0開始,那麼'每次設置一個值'時,檢查設置的內容,並根據新值是否爲空來執行+ = 1或 - = 1。通過這種方式,您將始終擁有「value!= null」統計數據,並且不需要每次都掃描整個集合。 – quetzalcoatl 2014-10-30 20:51:24

回答

1

NameValueCollection沒有實現IEnumerable<T>但是你可以使用OfTypeKeys物業把鑰匙進入IEnumerable<string>和使用Count方法:

int nullCount = collection.Keys.OfType<string>().Count(x => collection[x] != null); 
+1

我真的好奇誰是downvoting所有的答案,並沒有提供理由......反正 - OfType VS演員 - 我認爲盲演會更適用,因爲我們知道所有的鍵總是字符串。微小的性能差異,但它更多的是語義提醒。但當然,沒什麼大不了的。我只是覺得不得不咆哮有關downvotes;) – quetzalcoatl 2014-10-30 20:59:26

1

你的意思是這樣的:

NameValueCollection collection = ...; // init as appropriate 

int countOfNull = collection.Cast<string>().Where(key => collection[key] != null).Count; 

在這種情況下你如何發現自己並不十分清楚。如果你可以使用更合適的數據結構,那麼知道已經填充了多少個密鑰是一種立即可用的值(例如,在集合旁邊保留一個計數器,或者僅當添加密鑰/值對時才更好值等)

+0

我同意當前的集合類型是不合適的,但這是那些返回並將其更改爲字典或更合適的內容比當前情況的不便更加努力。 – Matt 2014-10-30 21:36:05

相關問題