很很多次都想在自己的BLOG上YY一下,但在写到一半的时候,在预先读一下都很痛恨自己以前为什么不多看一看小说什么的,才弄的现在自己的文笔是这么的烂,于是又将写的那些东西给删了.
说正题吧,昨天在快要下班之际,接到任务要添加个新功能:用户输入一些数据,之后清除掉小于平均数的数据,要是C++那就好了,找个vector容器,在弄个仿函数什么的要什么功能都解决了,但在.NET中的就想到用ArrayList进行收集数据. 但清除想用foreach就不行了(只读迭代器)
ArrayList container
=
new
ArrayList();
public int Add( uint val)
... {
return container.Add(val);
}
public void Clean( uint val)
... {
for (int i=0;i<container.Count;i++)
...{
if ((uint)container[i] < val)
...{
container.RemoveAt(i);
}
}
}
public int Add( uint val)
... {
return container.Add(val);
}
public void Clean( uint val)
... {
for (int i=0;i<container.Count;i++)
...{
if ((uint)container[i] < val)
...{
container.RemoveAt(i);
}
}
}
好了,赶紧测试,呵呵,问题来了数据肯定不正确了,最先向导container.Count是动态变化的,而且在删除数据时ArrayList中的数据索引又已经变动了.这时下班时间已过,这时大脑已经只想回家了,想了下面一个馊主意:
public
void
Clean(
uint
val)
... {
ArrayList temp = new ArrayList(10);
for(int i = 0;i<container.Count;i++)
...{
if ((uint)container[i] < val)
...{
temp.Add(container[i]);
}
}
if(temp.Count <= 0)
return;
for(int i=0;i<temp.Count;i++)
...{
if(list.Contains(temp[i]))
...{
container.Remove(temp[i]);
}
}
}
... {
ArrayList temp = new ArrayList(10);
for(int i = 0;i<container.Count;i++)
...{
if ((uint)container[i] < val)
...{
temp.Add(container[i]);
}
}
if(temp.Count <= 0)
return;
for(int i=0;i<temp.Count;i++)
...{
if(list.Contains(temp[i]))
...{
container.Remove(temp[i]);
}
}
}
好了,弄好走人...早上想起来那代码真是吓人呀,还好没提交掉,赶紧到公司来个大早,想一想有几种方法解决,
1.进行排序在使用ArrayList的RemoveRange方法(局限行比较大,因为这个方法是删除连续的元素,选择条件不灵(要是只清除奇数呢)还有前面那个排序,真是恶心)
2.想一下昨天开始的代码为什么不行,原因是删除元素后,里面元素的索引(不敢说位置,呵呵)发生了变化.进行修改以下:
public
void
Clean(
uint
val)
... {
for (int i=0;i<container.Count;i++)
...{
if ((uint)container[i] < val)
...{
container.RemoveAt(i);
i --;
}
}
}
... {
for (int i=0;i<container.Count;i++)
...{
if ((uint)container[i] < val)
...{
container.RemoveAt(i);
i --;
}
}
}
万事大吉,OK,咋一看,这代码我以前不是写过吗,我倒!#$^&*$^#$
写程序的时候真的来不得半点马虎呀!