2

我有一个实用方法,定义为

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

我有一些遗留代码不幸使用ArrayLists 而不是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

谢谢你的时间。

4

3 回答 3

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;
于 2013-05-31T09:18:37.253 回答
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;
}
于 2013-05-31T09:22:28.750 回答
1

在我的情况下不会引发任何错误:

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

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>(); }
    }
}
于 2013-05-31T09:20:20.823 回答