我有一个返回字符串列表的函数。
我可以循环遍历该列表,就像它是一个数组一样。
在这样做之前我是否应该将其转换为数组?
编辑: 我问的原因是因为我看到在线(和SO)上的代码使用List(或其他类型)操纵/创建字符串集合,但在返回时调用ToArray,为什么?
答案 0 :(得分:1)
一个原因是确保您没有将原始列表暴露给客户端代码。如果您确实暴露了,那么他们可以向返回的List<T>
添加/删除元素,这将修改源列表,因为List<T>
是引用类型。这可能不是预期的行为。
如果您使用ToArray
并返回数组,则不必担心数组中的修改,因为它只是数据的副本。
如果您对某些示例代码有一些具体问题,您可能会得到一个具体的答案。
答案 1 :(得分:0)
除非您有特定用例,否则不需要。与使用.NET开箱即用的Arrays相比,操作/搜索列表有更多选项。
如果您正在处理对内存敏感的应用程序,那么Arrays的内存占用量可能会略微减小,但我不担心,除非内存对您的应用程序来说是一个非常敏感的问题。
答案 2 :(得分:0)
一个原因是你有一个类充当缓存,例如一个类具有字段listOfAllClients,并且您希望返回子集,如下所示
List<Clients> _listOfClientCache ;
private client[] GetSClientsByCity(string city)
{
_listOfClient.Where(x => x.Client.City = city).ToArray();
}
我看到的一个原因是内存占用打印,如果调用者不想添加或删除元素,那么它会节省内存。
List是使用数组实现的,但是当需要添加大于下划线数组的元素时,它只是将底层数组和复制元素的大小加倍。因此,基础数组的大小很可能超过List中的实际元素。
转换为Array将释放为未使用元素分配的内存。
以下是测试
[TestMethod]
public void ListAndArrayTest()
{
int[] array = GetArray();
Debug.WriteLine("IsFixedSize {0}, Elements {1}", array.IsFixedSize, array.Length);
// This will print IsFixedSize True, Elements 35
}
private int[] GetArray()
{
List<int> localList = new List<int>();
for (int i = 0; i < 35; i++)
{
localList.Add(i);
}
Debug.WriteLine("Capacity {0}, Element Count {1}", localList.Capacity, localList.Count);
// This will print Capacity **64**, Element Count **35**
return localList.ToArray();
}
输出:容量64,元素数35 IsFixedSize True,Elements 35
从输出中可以清楚地看到调用者有纯数组,而不是任何原始列表的引用,它使用了64位元素的引擎下的数组,因为它需要更多的元素,它将数组的大小加倍到64和将元素复制到它。
一旦将它转换回数组,调用者就会有35个元素的数组。
答案 3 :(得分:0)
您可能看到的示例代码可能会进行某种惰性评估(例如,大多数Linq语句都会这样做)。 在这种情况下,将结果转换为数组以立即执行查询而不是在第一次迭代期间对其进行求值是有意义的。
示例:
// persons will only be lazy evaluated, which means
// the query will only execute when the "persons" are iterated.
var persons = Persons.Select(x => x.Name == "John Doe");
// here the "ToArray" forces an immediate execution of the query
var personsArray = Persons.Select(x => x.Name == "John Doe").ToArray();
答案 4 :(得分:-1)
阵列比列表更轻量级结构,并没有提供实际的操作方法
(通过操作我的意思是:添加和删除项目)
要向数组添加项目或从数组中删除项目,您需要重新定义数组。
列表允许您使用.Add和.Remove等方法 - 使它们更适合于集合操作结构。
如果您的要求只关注于在集合中查找项目 - 坚持使用数组,但如果您需要操作集合,请转到列表。
将列表视为操作数组的特殊接口。