【问题标题】:Is it possible to loop input into an array without setting how big the array is in C#?是否可以在不设置 C# 中数组的大小的情况下将输入循环到数组中?
【发布时间】:2011-01-09 09:07:11
【问题描述】:

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

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

有没有一种方法可以循环并让数组的元素数量取决于输入的数量?

TIA

【问题讨论】:

标签: c# arrays loops


【解决方案1】:

您想使用List

【讨论】:

    【解决方案2】:

    使用List object 以便您可以add 将循环中每次迭代的结果添加到列表中,直到您处理完所有输入。这样您就不必跟踪数组的索引/大小。

    List 类有一个ToArray() method,如果你想将结果存储在一个数组中,你可以在循环之后使用它。您可以从您的方法中返回数组,也可以在将 List 对象转换为数组后清除它,以防止周围有多余的数据副本。

    【讨论】:

    • Fernando 提出了一个关于 ArrayList 的好观点。您可以在 ArrayList 上调用可以在 List 上调用的相同方法。
    • 绝对需要一个 List 对象并使用 ToArray 方法
    【解决方案3】:

    如果您知道输入长度,则可以使用该值初始化数组。否则,您应该将List 用于强类型集合或ArrayList

    如果您的输入是 IEnumerable,您可以使用 List.AddRange 来添加所有值而无需循环。

    您应该注意,List 和 ArrayList 完全按照您想要的方式工作。正如文档所述,他们使用“一个大小根据需要动态增加的数组”。

    【讨论】:

    • +1:很好,感谢您提出 ArrayList。我假设我的回答是输入大小并不总是相同的。
    【解决方案4】:

    看看ArrayList 集合。你可以给它一个初始分配大小,你也可以Additems给它。

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

    当然,将其预分配到合理的大小比从 0 一次添加一个项目更有效 - 但无论哪种方式都可以。

    【讨论】:

    • 如果您在 .Net 1.1 上遇到问题,我只会使用 ArrayList:stackoverflow.com/questions/725459/…
    • @Lance:当您不知道可用的 .NET 版本或在编译时不知道数据类型时,ArrayList 是最佳选择。再次阅读问题。
    【解决方案5】:

    更好的是,尽可能使用通用列表。自从它们在 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 方式,可以将您的列表功能封装在一个地方,而且通常是有机地分离您的关注点的好方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 2012-09-23
      相关资源
      最近更新 更多