2012-01-17 96 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

相关问题