请考虑以下代码:
List<double> l = new List<double>();
//add unknown number of values to the list
l.Add(0.1); //assume we don't have these values ahead of time.
l.Add(0.11);
l.Add(0.1);
l.ToArray(); //ultimately we want an array of doubles
这种做法有什么问题吗?有没有更合适的方法来构建数组,而不知道大小或元素提前?
答案 0 :(得分:8)
你的方法没有错。您正在使用正确的数据类型。
答案 1 :(得分:3)
经过一些观察后,您可以更好地了解该列表中的总元素。然后,您可以在构造函数中创建具有初始容量的新列表:
List<double> l = new List<double>(capacity);
除此之外,它是正确的技术和数据结构。
<强>更新强>:
如果你:
Add
结构的ToArray
和List<T>
个功能,然后你可能想要编写自己的界面:
public interface IArrayBuilder<T>
{
void Add(T item);
T[] ToArray();
}
然后编写自己的实现,这可能比List<T>
更好。这是为什么?因为List<T>
在内部拥有一个数组,并且在需要时会增加其大小。在性能方面增加内部数组成本的过程,因为它分配了新内存(并且可能将旧数组中的元素复制到新数组中,我不记得了)。但是,如果上述所有条件都成立,那么您只需构建一个数组,就不需要在内部将所有数据存储在单个数组中。
我知道这是一个很长的镜头,但我认为分享这些想法会更好......
答案 2 :(得分:0)
正如其他人已经指出的那样:这是正确的做法。我只想补充说,如果你能以某种方式避免数组并直接使用List<T>
或者IEnumerable<T>
,你将避免复制数组,因为ToArray
实际上复制了列表的内部数组实例。
Eric Lippert有一个很棒的post about arrays,你可能会觉得相关。
答案 3 :(得分:-1)
像List这样的动态数据结构是实现它的正确方法。数组在List上唯一真正的优势是O(1)访问性能(与List中的O(n)相比)。灵活性足以弥补这种性能损失imho