代码之家  ›  专栏  ›  技术社区  ›  Zachary Scott

向特定索引号添加IList项

  •  9
  • Zachary Scott  · 技术社区  · 15 年前

    我们客户机的数据库返回数组中的一组价格,但有时它们不包括所有价格,即它们的数组中缺少元素。我们返回作为ilist找到的内容,当我们从数据库中检索内容时,它工作得很好。但是,我们很难将元素设置在数组中的适当位置。

    是否可以创建IList,然后在IList中的特定位置添加元素?

    var myList = new List<Model>();
    var myModel = new Model();
    myList[3] = myModel;  // Something like what we would want to do
    
    4 回复  |  直到 7 年前
        1
  •  3
  •   Matt Hamilton    15 年前

    列表在添加时动态增长以适应项目。您必须使用预先定义的大小初始化列表。我能想到的最简单的方法是:

    var myList = new Model[100].ToList();
    

    这将给您一个包含100个项目的列表,全部为空。然后您可以自由地为mylist[3]指定一个值。

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

        2
  •  18
  •   this. __curious_geek    15 年前

    使用 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

    如果index等于ilist中的项数,则会将项追加到列表中。

    在连续元素集合(如列表)中,插入点后面的元素向下移动以容纳新元素。如果集合已编入索引,则移动的元素的索引也将更新。此行为不适用于在概念上将元素分组到存储桶(如哈希表)中的集合。

        3
  •  7
  •   IsmailS    15 年前
        4
  •  0
  •   user999913    7 年前

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

     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;
    
            }