如何使用List代替ArrayList

本文关键字:代替 ArrayList 何使用 List | 更新日期: 2023-09-27 18:33:16

这些天一直在听到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());
    }

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

但我听到了关于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
    }

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

如何在List<T>方法中只编写一种Process方法?即使在这里,List<T>也可以替换 ArrayList 吗?

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

如何使用List<T>代替ArrayList

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

正如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(...) };
可以使用

LINQ 将类型安全列表转换为List<object>

List<object> objList = GetListBool().Cast<object>().ToList();