【问题标题】:Set List Initial Size [closed]设置列表初始大小
【发布时间】:2013-04-05 20:56:17
【问题描述】:

如何使用 C# 在 .Net 中设置特定对象类型列表的初始大小,并能够在指定索引处插入完全分配的对象?

【问题讨论】:

  • 你的意思是List<T>?你肯定需要插入,还是只覆盖?
  • 使用List<T>你不能只使用Insert(index, item)吗?
  • @mattytommo 当然可以。它会抛出一个索引超出范围异常,你可以编译它。
  • @Servy 如果您在不大于列表大小的位置插入,则不会。
  • 你要的是一个数组,它也实现了IList接口。

标签: c# .net arrays list


【解决方案1】:

List<T> 构造函数将int 作为初始列表容量的参数,但它实际上并未在列表中创建该数量的元素,因此这将抛出ArgumentOutOfRangeException

var items = new List<int>(10);
items[4] = 3;

您可以创建自己的方法来创建这种List,具有初始大小:

private static List<T> CreateList<T>(int capacity)
{
    return Enumerable.Repeat(default(T), capacity).ToList();
}

它会让它工作:

var items = CreateList<int>(10);

items[4] = 3;

但是 - 当您知道所需容量时,为什么不直接使用 Array 而不是 List

无 LINQ 版本

private static List<T> CreateList<T>(int capacity)
{
    List<T> coll = new List<T>(capacity);
    for(int i = 0; i < capacity; i++)
        coll.Add(default(T));

    return coll;
}

【讨论】:

  • @MarcinJuraszek 感谢您的回答,但到目前为止这对我不起作用。这就是我所拥有的。 subFields = CreateList&lt;Field&gt;(numOfComponents);subFields.Insert(subField.segIndex, field);Exception Thrown: System.NullReferenceException: Object reference not set to an instance of an object.
【解决方案2】:

这可以通过数组轻松完成:

string[] sa = new string[99];
sa[71] = "g";

这也恰好实现了 IList 接口。

【讨论】:

  • 您不能将项目插入到数组中。您只能替换一个值。
  • @Servy 正如已经多次指出的那样,短语“在特定位置插入”显然是模棱两可的,并且暗示“覆盖”或“插入到插槽中”的含义与其暗示的含义一样多或更多。链表的“插入和推出”。当您谈论在特定位置插入时,您通常打算将其他位置的对象留在原处而不是更改位置。
  • 如果您不打算让任何其他对象更改位置,那么适当的术语将是“替换”或“覆盖”。不是“插入”。如果这是预期的含义,那么该术语的使用不恰当。
  • @Servy 对不起,但这是对语言如何工作的狭隘观点。术语“插入”,即使在最严格的 CS 技术术语中也至少具有三个有效含义,其中两个可能在此处使用。具体来说,“向数组中插入一个值”这一短语已有 50 年的历史,旨在将一个值分配给特定的数组偏移量,而通常并不意味着将该偏移量(以及所有更高的偏移量)处的值转移到下一个更高的值数组偏移。 Insert only 清楚地暗示应用于链表时的上移。
  • 我认为我从未见过Insert 用于将值插入到数组中。你通常设置一个数组的值,你不向数组中插入一个值。
【解决方案3】:

List Constructor (Int32)

List.Insert Method

声称插入失败的投票者。
您是否阅读了链接中的文档?
如果 index 小于 0,则 ArgumentOutOfRangeException - 或 - index 大于 Count。
所以容量和计数不一样 - 不会使答案出错。
如果 index 小于 0 或 index 大于 Count,则 MarcinJuraszek 的答案将引发 ArgumentOutOfRangeException。
我在生产应用程序中使用它来按字母顺序加载,然后在索引 0 处插入任何用户添加,它从未抛出异常。

【讨论】:

    【解决方案4】:

    可以使用构造函数重载List&lt;T&gt;(int capacity)

    var l = new List<string>(42);
    

    创建一个容量为 42 的列表。

    【讨论】:

    • 我投了反对票。看看我的回答你就知道为什么了。
    • 好的,我将问题读作“填写列表时,我希望能够插入项目”而不是“我希望能够从头开始插入项目”(例如:添加item 0, item 1, 在 0 和 1 之间插入项目) 与 List&lt;T&gt;.Insert 一起使用
    【解决方案5】:

    据我所知,将列表的初始大小设置为与数组相比,与 List 背后的整个想法背道而驰。

    但这是你的做法:

    List<ItemType> list = new List<ItemType>(size); 
    

    size 是 int 数据类型。

    【讨论】:

    • 设置初始容量,而不是初始大小
    猜你喜欢
    • 2010-09-19
    • 2012-07-12
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    相关资源
    最近更新 更多