2012-01-17 72 views
2

這是我的代碼:我該如何檢查一個Hashtable值是否都是0?

Hashtable actualValues = new Hashtable(); 
actualValues.Add("Field1", Int32.Parse(field1.Value)); 
actualValues.Add("Field2", Int32.Parse(field2.Value)); 
actualValues.Add("Field3", Int32.Parse(field3.Value)); 

bool isAllZero = true; 
foreach (int actualValue in actualValues) 
{ 
    if (actualValue > 1) 
     isAllZero = false; 
} 
if (isAllZero) 
{ 

} 

,但我得到的第6行此異常System.InvalidCastException: Specified cast is not valid.,靠近foreach

我在哪裏錯了?

+0

什麼是 'actualValues' 的類型? – 2012-01-17 14:19:11

+0

請顯示'actualValues'的聲明 – yas4891 2012-01-17 14:19:28

+0

(string,int),你可以在代碼中看到! – markzzz 2012-01-17 14:19:50

回答

3

Hashtable的回報返回IDictionaryEnumerator類型的一個IEnumerator,元素返回通過MoveNext方法是DictionaryEntry類型,不是int - 你的foreach循環是無效的。

嘗試以下操作:

bool isAllZero = actualValues.Values.Cast<int>().All(v => v == 0); 

或者沒有的Linq:

bool isAllZero = true; 
foreach (int actualValue in actualValues.Values) 
{ 
    if (actualValue != 0) 
    { 
    isAllZero = false; 
    break; 
    } 
} 
+0

我得到ICollection不包含All()...的定義!它不起作用:( – markzzz 2012-01-17 14:28:56

+1

@markzzz你包括一個使用拉入'系統。Linq'命名空間幷包含對'Cast '的調用? – 2012-01-17 14:30:33

+0

不錯!有用! – markzzz 2012-01-17 14:44:00

3

當你循環散列表時,你會得到一個DictionaryEntry,而不是int

foreach (DictionaryEntry entry in actualValues) 
{ 
    if (((int)entry.Value) > 1) 
     isAllZero = false; 
} 
+0

那麼,我該如何解決它? – markzzz 2012-01-17 14:21:41

+0

@markzzz - 我更新了。 – 2012-01-17 14:22:07

+0

從'isAllZero'的語義,比較應該可以用'> ='來完成 - 但這只是一個猜測 – yas4891 2012-01-17 14:22:48

5

假設你可以使用LINQ

bool isAllZero = Hashtable.Cast<DictionaryEntry>().All(pair => (int)pair.Value == 0); 

而且如果你用Dictionary<string, int>更換HashTable,它成爲

bool isAllZero = dictionary.All(pair => pair.Value == 0); 
+1

散列表返回'DictionaryEntry' – 2012-01-17 14:23:28

+0

@ DanielA.White感謝您發現這一點。 – 2012-01-17 14:25:20

+0

你也將不得不施放'價值'。 – 2012-01-17 14:28:16