C# 不使用ToArray()获取列表的内部数组

C# 不使用ToArray()获取列表的内部数组,c#,data-structures,C#,Data Structures,我有一个需要列表或数组的方法。我不想为它创建重载,因为它不是一个简单的方法。所以我决定这样做: public float BoundingBox(RoadNode[] nodes) public float BoundingBox(IEnumerable<RoadNode> nodes){ IList<RoadNode> list; if (nodes is IList<RoadNode>) list = (IList<RoadNode

我有一个需要列表或数组的方法。我不想为它创建重载,因为它不是一个简单的方法。所以我决定这样做:

public float BoundingBox(RoadNode[] nodes)
public float BoundingBox(IEnumerable<RoadNode> nodes){
    IList<RoadNode> list;
    if (nodes is IList<RoadNode>) list = (IList<RoadNode>)nodes;
    else list = nodes.ToList();
    //Do Something with list
}

客户端上的RoadNodes有时在数组中,有时在列表中。因此,当客户机有一个列表时,我必须在列表上调用ToArray(),然后调用此方法,但这是不可接受的,因为它会将项目复制到一个新数组。性能是个大问题,所以我不想要任何耗时的东西。那我该怎么办

如果您只是对其进行枚举,只需将其更改为单个签名即可:

public float BoundingBox(IEnumerable<RoadNode> nodes)
公共浮点边界框(IEnumerable节点)
如果需要列表和数组的索引行为,可以将签名更改为:

public float BoundingBox(IList<RoadNode> nodes)
公共浮点边界框(IList节点)
第一种可能更可取,因为您可以编写如下代码:

public float BoundingBox(RoadNode[] nodes)
public float BoundingBox(IEnumerable<RoadNode> nodes){
    IList<RoadNode> list;
    if (nodes is IList<RoadNode>) list = (IList<RoadNode>)nodes;
    else list = nodes.ToList();
    //Do Something with list
}
公共浮点边界框(IEnumerable节点){
IList列表;
如果(节点为IList)列表=(IList)节点;
else list=nodes.ToList();
//用列表做些什么
}

能否将参数类型更改为
IList
?这样你就可以传入一个列表或数组,而不需要任何转换。你是否测量过ToArray()的大小写,或者只是觉得它太慢了?@DStanley是的,它可以工作。Thanks@HenkHoltermanMSDN文档说ToArray()“将列表中的元素复制到一个新数组中。”千万不要假设。测量你的瓶颈并从那里开始。早期优化是很多罪恶的根源。谢谢。完美答案。