【发布时间】:2011-01-09 09:07:11
【问题描述】:
这可能是一个非常基本的问题,但我在任何地方都找不到答案。
我正在尝试循环输入并使用 C# 将结果放入数组中。从我读到的数组必须首先设置元素的数量。
有没有一种方法可以循环并让数组的元素数量取决于输入的数量?
TIA
【问题讨论】:
这可能是一个非常基本的问题,但我在任何地方都找不到答案。
我正在尝试循环输入并使用 C# 将结果放入数组中。从我读到的数组必须首先设置元素的数量。
有没有一种方法可以循环并让数组的元素数量取决于输入的数量?
TIA
【问题讨论】:
您想使用List。
【讨论】:
使用List object 以便您可以add 将循环中每次迭代的结果添加到列表中,直到您处理完所有输入。这样您就不必跟踪数组的索引/大小。
List 类有一个ToArray() method,如果你想将结果存储在一个数组中,你可以在循环之后使用它。您可以从您的方法中返回数组,也可以在将 List 对象转换为数组后清除它,以防止周围有多余的数据副本。
【讨论】:
如果您知道输入长度,则可以使用该值初始化数组。否则,您应该将List 用于强类型集合或ArrayList。
如果您的输入是 IEnumerable,您可以使用 List.AddRange 来添加所有值而无需循环。
您应该注意,List 和 ArrayList 完全按照您想要的方式工作。正如文档所述,他们使用“一个大小根据需要动态增加的数组”。
【讨论】:
看看ArrayList 集合。你可以给它一个初始分配大小,你也可以Additems给它。
ArrayList 的容量是 ArrayList 可以容纳的元素数。当元素添加到 ArrayList 时,容量会根据需要通过重新分配自动增加。可以通过调用 TrimToSize 或显式设置 Capacity 属性来减小容量。
当然,将其预分配到合理的大小比从 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();
这是一种很好的 OOPy 方式,可以将您的列表功能封装在一个地方,而且通常是有机地分离您的关注点的好方法。
【讨论】: