需要Hashtable和Arraylist

我试图在我的Windows 7 Phone应用程序中使用其他人的C#类。 这些类使用Hashtable类型的对象。

有问题的文件有

using System.Collections; 

在顶部,所以我假设它是它想要的Hashtable对象。

当我尝试构建我的解决方案时,我得到的错误是找不到类型或命名空间名称’Hashtable’,是否缺少using指令或程序集引用。

在微软的Hashtable文档中,我看到它表示Assembly:mscorlib

但是如果我尝试通过Project> Add Reference添加mscorlib,VS说它无法添加它,因为它是由构建系统自动引用的。

我错过了什么?

Silverlight中不包含非generics集合,包括ArrayListHashTable
这些类是.Net 1.0(没有generics)的保留,不应该在新代码中使用。

相反,您应该使用generics集合 – ListDictionary

你有几个选择:

  1. 将导入更改为using System.Collections.Generic; 并将HashTable每次使用更改为Dictionary<>ArrayList to List<>

  2. 可能会逃脱:

    using HashTable = System.Collections.Generic.Dictionary;
    using ArrayList = System.Collections.Generic.List;
    请注意,任何未来的维护者都会讨厌这样做。

  3. 但最好重构代码以正确使用generics集合。

  4. 在命名空间System.Collections创建一个HashtableIDictionary通过将所有内容转发到内部Dictionary来实现IDictionary ,并实现必要的行为更改(锁定,缺少键等); 通过封装List创建ArrayList 。 (由henon建议)

根据您使用的.NET框架,有不同的mscorlib。 如果您查看MSDN页面上的“其他版本”下拉列表,您将看到Hashtable不是Silverlight的一部分。 您将需要使用Dictionary (或理想情况下更强类型的键和值类型)

Hashtable不在Silverlight中

但是词典是

System.Collection是.Net的第一个版本的遗产 – 没有generics类型。

要修复你的代码,请使用Dictorany类,它是一个哈希表,并且列出了ArrayList。

它对我有用:

Dictionary Hashtable

Dictionary NameValueCollection

我遇到的其他问题是Encoding.ASCII也没有定义,我用一个函数stackoverflow lad写道:

 public static byte[] StringToAscii(string s) { byte[] retval = new byte[s.Length]; for (int ix = 0; ix < s.Length; ++ix) { char ch = s[ix]; if (ch <= 0x7f) retval[ix] = (byte)ch; else retval[ix] = (byte)'?'; } return retval; } 

学分:

ASCIIEncoding在Windows Phone 7中

所以最后返回ASCII这是做什么的:

return StringToAscii(Encoding.Unicode.GetString(result.ToArray()));