C#学习教程:C#中List的一种方法,比如c++中的vector的resizeC++中的一个vector,表示这个vector的大小设置为newsize,索引运行在[0..newsize)范围内。我如何在C#中对List做同样的事情?改变List属性Capacity只改变Capacity但Count不变,此外索引仍在[0..Count)范围内。请帮我。PS假设我有一个tmp.size()==5的矢量tmp我不能引用tmp[9],但是当我使用tmp.resize(10)时我可以引用tmp[9]。在C#中,如果我有Listtmp和tmp.Count==5我不能引用tmp[9](IndexOutOfRangeException),但即使我设置tmp.Capacity=10我也不能引用tmp[9]因为tmp.Count仍然是5。我想在C#中找到一些调整大小的类比。不,但您可以使用扩展方法添加自己的。下面的行为与std::vector::resize()相同,包括相同的时间复杂度。唯一的区别是,在C++中,我们可以使用voidresize(size_typesz,Tc=T())定义一个默认值,而模板的工作方式意味着如果我们在没有默认值的情况下调用它,则没有参数可访问T那么没有问题的构造函数.在C#中我们不能这样做,所以我们必须创建一个没有约束的方法来匹配非默认用法,以及另一个创建调用它的wherenew()约束的方法。publicstaticclassListExtra{publicstaticvoidResize(thisListlist,intsz,Tc){intcur=list.Count;if(szcur){if(sz>list.Capacity)//这个位纯粹是一个优化,避免多次自动改变容量。列表.Capacity=sz;list.AddRange(Enumerable.Repeat(c,sz-cur));}}publicstaticvoidResize(thisListlist,intsz)whereT:new(){Resize(list,sz,newT());现在像myList.Resize(23)或myList.Resize(23,myDefaultValue)这样的东西将匹配C++的向量所期望的。我注意到有时在C++中你会有一个指针向量,而在C#中你会得到一些引用类型列表。因此,在C++T()产生一个空指针(因为它是一个指针)的地方,我们希望它调用一个无参数构造函数。出于这个原因,您可能会发现它更接近您习惯于用以下方法替换第二种方法的行为:publicstaticvoidResize(thisListlist,intsz){Resize(list,sz,default(T));这与值类型(调用无参数构造函数)具有相同的效果,但对于引用类型,它将填充空值。在这种情况下,我们可以将整个类重写为:publicstaticclassListExtra{publicstaticvoidResize(thisListlist,intsz,Tc=default(T)){intcur=list.Count;if(szcur)list.AddRange(Enumerable.Repeat(c,sz-cur));注意这里不是std::vector和List的区别,而是C++和C#中指针使用方式的区别。只是为了让JonHanna的回答更具可读性:=default(T)){intcount=list.Count;if(sizecount){if(size>list.Capacity)//优化list.Capacity=size;list.AddRange(Enumerable.Repeat(element,size-count));}}}对不起。这是你需要的吗?List.TrimExcess()设置List.Capacity就像使用std::vector.reserve(..)一样。也许List.AddRange(..)适合您的需要。您是否在MSDN上阅读过:-列表是可调整大小的项目集合。可以用多种方式构造列表,但最有用的类是List。这允许您强类型列表,包括处理集合的所有基本功能,并使它们易于搜索。此外:-Capacity是List在需要调整大小之前可以存储的元素数,而Count是List中实际存在的元素数。容量始终大于或等于计数。如果在添加元素时Count超出容量,则在复制旧元素和添加新元素之前通过自动重新分配内部数组来增加容量。这是我的解决方案。privatevoidlistResize(Listlist,intsize){if(size>list.Count)while(size-list.Count>0)list.Add(default);elseif(size0)list.RemoveAt(list.Count-1);}当size和list.Count相同时,不需要调整列表的大小。使用default(T)参数而不是null、""、0或其他可空类型来填??充列表中的空项,因为我们不知道是什么类型(引用、值、结构等)。).PS我使用的是循环而不是while循环,我遇到了问题。列表的大小并不总是我要求的。它更小。有任何想法吗?验证:privatevoidlistResize(Listlist,intsize){if(size>list.Count)for(inti=0;iListsdon'thaveafinitesize.Isthereareanyreasonforthissizeforyou?Maybe一个数组或者一个字典更接近你的要求以上是C#学习教程:C#中有一个List方法,比如c++中的resizevector全部内容分享,如果对大家有用需要了解更多关于C#学习教程,希望大家多多关注——本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,如有转载请注明出处:
