在C#中,是否有可能将输入循环存入数组而不设置数组大小?

3

这可能是个非常基本的问题,但我无法在任何地方找到答案。

我正在尝试使用C#循环输入并将结果放入数组中。根据我所读的,数组首先必须设置元素数量。

是否有一种方法可以仅循环并使数组元素的数量取决于输入的数量?

TIA


请添加新项到现有的C#数组中。 - Jay
5个回答

8
使用List对象,这样你就可以将循环的每次迭代结果添加到List中,直到处理完所有的输入。然后你就不必再跟踪数组的索引/大小了。 List类有一个ToArray()方法,你可以在循环后使用它,如果你想将结果存储在数组中。你可以从方法中返回数组,或者在将其转换为数组后清除List对象,以避免数据的额外副本。

1
Fernando提出了一个关于ArrayList的好观点。你可以在ArrayList上调用与List相同的方法。 - David
1
你需要的肯定是一个List对象,并使用ToArray方法。 - Zied

3
如果您知道输入的长度,可以用该值初始化数组。否则,您应该使用List来进行强类型集合或ArrayList
如果您的输入是IEnumerable,则可以使用List.AddRange添加所有值,无需循环。
请注意,List和ArrayList正是您想要的方式工作。正如文档所述,它们使用"根据需要动态增加大小的数组"。

+1:好观点,感谢提出ArrayList。我在回答中假设输入大小不总是相同的。 - David

0

而且更好的是,尽可能使用通用列表。自从它们在2.0中推出以来,我不认为我曾经使用过普通的ArrayList。

List<string> myNames = new List<string>();
myNames.Add("kevin");
string[] myNamesTurnedToStringArray = nyMames.ToArray();

进一步地说,我发现几乎每次需要集合时,都需要它来执行更多的简单语句。如果您发现在代码库中频繁使用列表,您可能需要考虑对列表进行子类化
public class Widgets : List<Widgets> // Widgest class defined elsewhere
{
    public Widgets() : base() {}
    public Widgets(IEnumerable<Widgets> items) : base(items) {}

    public Widget GetWidgetById(int id)
    {
        // assuming only one ID possible
        return this.Where(w => w.id == id).Single(); 
    }

    public string[] GetAllNames()
    {
        return this.Select(w => w.Name).ToArray();
    }
}

//... later in some other class ....

Widgets w = new Widgets(dataFromDatabase);
Widget customerWidget = w.GetWidgetById(customerWidgetId);
string[] allNames = w.GetAllNames();

这是一种不错的面向对象编程方式,可以将列表功能封装在一个地方,并且通常是有机地分离您的关注点的好方法。


0

你想要使用一个List


-1

看一下ArrayList集合。你可以给它一个初始分配大小,也可以使用Add方法添加项目。

ArrayList的容量是ArrayList可以容纳的元素数量。当元素被添加到ArrayList中时,如果需要,容量会自动增加通过重新分配。容量可以通过调用TrimToSize或显式设置Capacity属性来减少。

当然,将其预先分配到合理的大小比从0开始逐个添加项目更有效率,但无论哪种方式都可以工作。


如果你被困在 .Net 1.1 的时代,我才会使用 ArrayList:https://dev59.com/questions/RnRB5IYBdhLWcg3wFz8g - Lance McNearney
@Lance:当你不知道可用的.NET版本或者在编译时不知道数据类型时,ArrayList是最好的选择。再读一遍问题。 - John Knoeller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接