我有ArrayList
,其中包含固定类型的对象。
但是每当我需要提取一个特定索引的对象时,我需要将它从对象类型强制转换为我的用户定义类型。
在C#中是否有一种方法可以像Java和C ++一样声明ArrayList
固定类型,或者是否有办法避免每次都进行类型转换?
编辑:
我道歉我忘了提到我要求数据结构是线程安全的, List
不是。否则我会使用正常的Array
。但是我希望在编写数组时避免显式锁定和解锁的努力。
所以我考虑使用ArrayList
,同步它,但每次都需要进行类型转换。
答案 0 :(得分:6)
您可以使用List. List类利用generics创建强类型集合。
要使用,只需调用新列表<您想要使用>()类型:
List<string> myStringList = new List<string>();
MSDN上有一些快速文章介绍了如何制作馆藏thread safe.
答案 1 :(得分:4)
看看System.Collections.Generic.List
答案 2 :(得分:3)
你有没有看过SynchronizedCollection<T>?它基本上是List&lt; T&gt;的线程安全版本。
请注意,此集合是System.ServiceModel的一部分,因为它是为了支持WCF的频道调度程序而添加的。它是一个公共集合,但是可以被任何代码使用,并且位于System.Collections.Generic命名空间中。它的所有方法和索引器都是同步的,因此您不必自己管理锁定。但请注意LINQ,因为此集合的枚举器不已同步。如果您希望使用枚举器或使用LINQ:
,则需要自己锁定SyncRootvar syncList = new SynchronizedCollection<int>();
// ...
lock(syncList.SyncRoot)
{
var itemsInRange = syncList.Where(v => v > 100 && v < 1000);
}
请记住,它使用硬锁定(lock关键字),并且对于许多线程,它不是最高性能的解决方案。如果您可以选择使用.NET 4.0,我会查看新的System.Collections.Concurrent命名空间,以获取一些像ConcurrentBag<T>这样的新鲜美食。
答案 3 :(得分:1)
是的,但您需要使用泛型。查看System.Collections.Generics命名空间中的List类。
答案 4 :(得分:1)
通用列表FTW!
var items = new List<someType>();
答案 5 :(得分:0)
答案 6 :(得分:0)
使用System.Collections.Generic.List<T>
。如果您想要线程安全,只需在操作中锁定SyncRoot
属性即可。
一些代码:
List<string> list = new List<string>();
lock (list.SyncRoot) {
list.Add("Hello World");
}
如果您发现每次锁定都很烦人,您可以覆盖List类并提供对成员函数的同步访问。