所以我已经编程了大约6个月,因为它是休息,我很无聊,玩弄东西.我再次讨论了数组的概念并制作了一个数组,它产生了50个randoms数字,并使用插入排序对它们进行排序.然后我开始搞乱字符串数组.string[] array = new string[] { "Ultima Online", "Everquest", "Baldur's Gate", "Diablo I"};
是我的字符串数组.为了让它显示整个字符串,我使用了一个链表(我不确定是否必须这样,我试图将其转换为无效,即Convert.ToString(数组)失败).所以我有这个
static void Main(string[] args) { string[] array = new string[] { "Ultima Online", "Everquest", "Baldur's Gate", "Diablo I"}; Listlist = new List (array); for (int i = 0; i < list.Count; i++) { Console.WriteLine(list[i]); } }
这将显示整个阵列.然后我想如果我想删除或添加一些内容.所以,我放在list.RemoveAt(2);
我的上方Console.Writeline(list[i]);
但这确实是我没想到的.它会删除列表中第二个点之后的所有内容.所以我假设RemoveAt()将始终删除指示的值之后的所有内容.但是,list.Remove(2);
给出了我的错误.1.参数1:无法从'int'转换为'string'然后2.最好的重载方法匹配... etc ..参数.我的演员再次无效.所以,我回到了RemoveAt,想了一下.出于某种原因,我想如果我使用等效的if语句,它会起作用,而且确实如此.
static void Main(string[] args) { string[] array = new string[] { "Ultima Online", "Everquest", "Baldur's Gate", "Diablo I" }; Listlist = new List (array); for (int i = 0; i < list.Count; i++) { if (i == 2) { list.RemoveAt(2); } Console.WriteLine(list[i]); }
所以,我的问题是:为什么异常发生在Remove()而不是RemoveAt().为什么if语句有效?我在黑暗中拍摄它并且它有效,我可以理解为什么它有效,但不是为什么简单的RemoveAt()不起作用.最后,有没有比链表更好的转换方式?
感谢任何回答这些问题的人.我是编程新手,我正在尝试理解在我的书和MSDN.com以及DotPearl上飞过我的一些概念......
RemoveAt
仅删除该索引处的元素.它并不能消除所有跟随它的元素.
除非....你把它放在一个循环中.
你做了什么.
所以你的循环做了这个:
删除元素2,输出元素0
删除元素2,输出元素1
删除元素2,输出元素2
... 等等
因为这个"工作":
for (.....; i < list.Count; ..... ) ^-- this ----^
基本上,你的循环和列表看起来像这样:
列表是"Ultima Online","Everquest","Baldur's Gate","暗黑破坏神I"(4个元素,0个元素,元素0到3)
索引为0,删除元素2,"Baldur's Gate",输出元素0,"Ultima Online"
索引是1,仍然低于长度(现在是3),所以删除元素2,"暗黑破坏神I",输出元素1,"无尽的任务"
索引是2,现在等于length(现在是2),所以退出
您在枚举时更改了列表,并且每次迭代都更改了列表.
之所以list.Remove(2)
不起作用是因为:
list.RemoveAt(x)
指定索引,并删除该索引处的元素
list.Remove(x)
指定一个值,列表中具有该值的第一个元素将被删除
现在在这种情况下你已经说过列表是一个字符串列表,你要求它删除一个整数.C#/ .NET不允许这样的恶作剧,因此在你允许运行程序之前告诉你这个问题.
有关更多信息,请查看以下文档:
List<T>
List<T>.RemoveAt
方法
List<T>.Remove
方法