在.NET4.5下使用ArrayList进行转换

时间:2013-05-31 09:11:01

标签: c# casting arraylist .net-4.5

我所有的实用程序方法都定义为

public static Dictionary<T, int> CountOccurences<T>(IEnumerable<T> items) { ... }

我有一些遗留代码,遗憾的是使用ArrayList代替List<T>。现在,我需要转换ArrayList以使用上述方法,以下两个应该工作

var v = CountOccurences<String>(arrayList.Cast<String>().ToArray());

var v = CountOccurences<String>(arrayList.OfType<String>().ToArray());

这些都不适用于在.NET 4.5下的VS2012中提供

  

'System.Collections.ArrayList'不包含'OfType'的定义,并且没有可以找到接受类型为'System.Collections.ArrayList'的第一个参数的扩展方法'OfType'(您是否缺少using指令或汇编参考?)

但是,我已在LINQpad中对此进行了测试,并且这两个都可以正常工作。 为什么我不能投放ArrayList

感谢您的时间。

3 个答案:

答案 0 :(得分:4)

以下在VS2012中对我来说很好用

        ArrayList al = new ArrayList();

        al.Add("a");
        al.Add("b");
        al.Add("c");

        var v = al.OfType<string>().ToArray();

        var list = new List<string>(v); //Constructor taking an IEnumerable<string>();

您收到了什么错误消息。

确保包含以下命名空间

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

答案 1 :(得分:3)

我认为“不工作”意味着你得到InvalidCastException。因此,ArrayList中的所有对象都不是字符串。您可以通过创建CountOccurences的新非泛型重载来解决问题,该重载需要ArrayList

(假设方法的功能)

public static Dictionary<string, int> CountOccurences(ArrayList items) 
{
    var dict = new Dictionary<string, int>();
    foreach(object t in items)
    {
        string key = "";
        if(t != null)
            key = t.ToString();
        int count;
        dict.TryGetValue(key, out count);
        dict[key] = count++;
    }
    return dict;
}

答案 2 :(得分:1)

在我的情况下不会抛出任何错误:

顺便说一句,你对OfType<T>的使用是错误的。这是一种方法,所以追加()

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _16853758
{
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList arrayList = new ArrayList();

            var a = CountOccurences<String>(arrayList.Cast<String>().ToArray());
            var v = CountOccurences<String>(arrayList.OfType<String>().ToArray());
        }

        public static Dictionary<T, int> CountOccurences<T>(IEnumerable<T> items) { return new Dictionary<T, int>(); }
    }
}