向 IList 中添加一个特定索引号的项

10
我们的客户数据库返回一个价格数组,但有时候它们不包含所有的价格,也就是说数组中可能会有缺失元素。我们将找到的内容作为IList返回,这在从数据库检索内容时非常有效。但是,在将元素设置到正确的位置时我们遇到了困难。
是否可能创建一个IList,然后在特定位置添加一个元素?
var myList = new List<Model>();
var myModel = new Model();
myList[3] = myModel;  // Something like what we would want to do

你的问题不是很清楚。我回答了我认为你在问什么,但如果你能详细说明一下你想做什么,我可能能够提供更好的答案。 - Matt Hamilton
我认为答案是Matt和Ismail的结合。我想在第3个位置插入一个项目,但列表中还没有任何内容。根据Matt的答案,我需要创建一个空列表,其中计数>我要插入的索引,然后需要使用Ismail的答案来实际插入它。另一个问题是插入将把所有在其上面的东西向上推一个,所以我几乎需要在3之前创建任何缺失的条目,然后.Add()。好吧,至少这就是我正在尝试做的。哈哈 - Zachary Scott
你实际上并不想插入它,是吗?如果列表有足够的项目,你只想覆盖特定元素上的一个吗?这就是“myList [3] = myModel;”所做的。 - Matt Hamilton
如果存在,则正确。如果不存在,则需要创建空白。 - Zachary Scott
4个回答

18

使用 IList<T>.Insert(int index,T item) 方法。

IList<string> mylist = new List<string>(15); 
mylist.Insert(0, "hello");
mylist.Insert(1, "world");
mylist.Insert(15, "batman"); // This will throw an exception.

来自MSDN

如果索引等于IList中的项目数,则将项目附加到列表中。

在连续元素的集合(例如列表)中,跟随插入点的元素会向下移动以容纳新元素。如果集合具有索引,则移动的元素的索引也会更新。这种行为不适用于元素被概念上分组到桶中的集合,例如哈希表。


7

3
  • 列表会随着添加的项目而动态增长。
  • 您需要使用预定义大小初始化列表。
  • 我能想到最简单的方法是:
var myList = new Model[100].ToList();

这将为您提供一个包含100个null项目的列表。然后,您可以自由地将值分配给myList [3]。

请注意,在您的代码中,您正在尝试实例化一个不可能的IList<Model> - 您需要一个具体类型(例如List<Model>)而不是接口。


我想要做的是将一个新项目插入到第3个位置,但显然列表需要连续,因此我需要在低于3的位置创建空白项目,然后再插入一个新项目。 - Zachary Scott
好的,我的答案是一种实现方法。预先用空项填充列表(最多填充你认为需要的最大数量),然后只分配你想要的项。 - Matt Hamilton

0

如果需要,它将插入并调整大小

 public static IList<T> InsertR<T>(this IList<T> ilist, int index, T item) {

        if (!(index < ilist.Count)) {

            T[] array = Array.CreateInstance(typeof(T), index + 1) as T[];

            ilist.CopyTo(array, 0);

            array[index] = item;

            if (ilist.GetType().IsArray) {
                ilist = array;
            } else {
                ilist = array.ToList();
            }


        } else
            ilist[index] = item;

        return ilist;

    }

或者

public static IList InsertR<T>(this IList ilist, int index, T item) {

            if (!(index < ilist.Count)) {

                T[] array = Array.CreateInstance(typeof(T), index + 1) as T[];

                ilist.CopyTo(array, 0);

                array[index] = item;

                if (ilist.GetType().IsArray) {
                    ilist = array;
                } else {
                    ilist = array.ToList();
                }


            } else
                ilist[index] = item;

            return ilist;

        }

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