我可以在C#中使用固定类型的ArrayList,就像C ++一样吗?

时间:2010-03-02 03:39:31

标签: c# arraylist

我有ArrayList,其中包含固定类型的对象。 但是每当我需要提取一个特定索引的对象时,我需要将它从对象类型强制转换为我的用户定义类型。

在C#中是否有一种方法可以像Java和C ++一样声明ArrayList固定类型,或者是否有办法避免每次都进行类型转换?

编辑:

我道歉我忘了提到我要求数据结构是线程安全的, List不是。否则我会使用正常的Array。但是我希望在编写数组时避免显式锁定和解锁的努力。

所以我考虑使用ArrayList,同步它,但每次都需要进行类型转换。

7 个答案:

答案 0 :(得分:6)

您可以使用List. List类利用generics创建强类型集合。

要使用,只需调用新列表<您想要使用>()类型:

List<string> myStringList = new List<string>();

MSDN上有一些快速文章介绍了如何制作馆藏thread safe.

答案 1 :(得分:4)

看看System.Collections.Generic.List

http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx

答案 2 :(得分:3)

你有没有看过SynchronizedCollection<T>?它基本上是List&lt; T&gt;的线程安全版本。

请注意,此集合是System.ServiceModel的一部分,因为它是为了支持WCF的频道调度程序而添加的。它是一个公共集合,但是可以被任何代码使用,并且位于System.Collections.Generic命名空间中。它的所有方法和索引器都是同步的,因此您不必自己管理锁定。但请注意LINQ,因为此集合的枚举器已同步。如果您希望使用枚举器或使用LINQ:

,则需要自己锁定SyncRoot
var 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)

如果您担心线程安全问题,那么ConcurrentBag<T>或许可以解决问题:

  

表示线程安全,无序的对象集合。

注意:这需要.NET 4。

答案 6 :(得分:0)

使用System.Collections.Generic.List<T>。如果您想要线程安全,只需在操作中锁定SyncRoot属性即可。

一些代码:

List<string> list = new List<string>();

lock (list.SyncRoot) {
   list.Add("Hello World");
}

如果您发现每次锁定都很烦人,您可以覆盖List类并提供对成员函数的同步访问。