1

这些天来,一直听说 ArrayList 已经过时了。但我确实有使用 ArrayList 的真实案例,如下所示:

    ArrayList GetArrayInt()
    {
        ArrayList l = new ArrayList();
        l.Add(2);

        return l;
    }

    ArrayList GetArrayBool()
    {
        ArrayList l = new ArrayList();
        l.Add(true);

        return l;
    }

    void Process(ArrayList l)
    {
        foreach (var o in l)
        {
            if (o is int)
            {

            }
            else
            {

            }
        }
    }

然后我这样打电话Process

    private void Form1_Load(object sender, EventArgs e)
    {
        Process(GetArrayInt());
        //or
        Process(GetArrayBool());
    }

底线是我不需要为Process整数和布尔值的 ArrayList 分别编写两个方法。

但我听到了关于 ArrayLists 的所有负面消息。所以我想使用List<T>. 这就是我想出的:

    List<bool> GetListBool()
    {
        var l = new List<bool>();
        l.Add(true);

        return l;
    }

    List<int> GetListInt()
    {
        var l = new List<int>();
        l.Add(2);

        return l;
    }

    void Process(List<object> l)
    {
        foreach (var o in l)
        {
            if (o is int)
            {

            }
            else
            {

            }
        }
    }

现在我该怎么称呼它?

    private void Form1_Load(object sender, EventArgs e)
    {
        Process(GetListInt()); //error
        Process(GetListBool()); //error
        Process((List<object>)GetListBool()); //error
    }

我在这里找到的唯一解决方案是为然后是两个方法编写单独的Process方法(我的实际代码要复杂得多,所以按照这种方法,我需要编写二十个这样的方法,它们都做同样的事情)。List<bool>List<int>Process

我怎样才能在方法Process中只写一种方法List<T>?即使在这里也可以List<T>替换 ArrayList 吗?

更新:所有三个答案都有效,但我最喜欢@Phil 的答案。谢谢大家

4

3 回答 3

3

这是一个奇怪的例子,不是非常 OOP,但是:您确实可以使用List<int>,List<bool>等 - 并将返回类型/参数类型更改为非泛型IListor IEnumerable。奇怪的例子。

于 2012-05-06T12:47:23.067 回答
1

您可以使用 LINQ 将类型安全列表转换为List<object>

List<object> objList = GetListBool().Cast<object>().ToList();
于 2012-05-06T12:50:27.793 回答
1

正如 Mark Gravell 所说,您的所作所为很奇怪,但您可以使用类型推断,Process<T>(IEnumerable<T>)如果您愿意,可以使用:

void Main()
{
    Process(GetInts());
    Process(GetBools());
}

IEnumerable<int> GetInts()
{
    return new List<int>{1,2,3};
}

IEnumerable<bool> GetBools()
{
    return new List<bool>{true, false, true};
}

void Process<T>(IEnumerable<T> items)
{
    foreach (var item in items)
    {
        if(item is int)
        {
           Debug.WriteLine("int: " + item.ToString());
        }
        if(item is bool)
        {
           Debug.WriteLine("bool: " + item.ToString());
        }
    }
}

不需要if(item is int)等的更明智的方法是对每种类型的 Process 进行重载

void Process(IEnumerable<int> items) { foreach(...) };
void Process(IEnumerable<bool> items) { foreach(...) };
于 2012-05-06T12:53:09.310 回答