如何使用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的答案。谢谢大家
这是一个奇怪的例子,不是很 OOP,但是:您确实可以使用 List<int>
、List<bool>
等 - 并将返回类型/参数类型更改为非泛型IList
或IEnumerable
。不过奇怪的例子。
正如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();