Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Foreach不';你不能检查所有的项目吗?_C#_Winforms - Fatal编程技术网

C# Foreach不';你不能检查所有的项目吗?

C# Foreach不';你不能检查所有的项目吗?,c#,winforms,C#,Winforms,我有以下代码: foreach (var item in ListView1.Items) { ListView1.Items.Remove(item); ListView21.Items.Add(item); } 循环在一半的项目上停止 有什么想法吗 编辑 好吧,也许是我的错,我需要澄清这是Infrajistics的UltraListView控件,在这里我不能将项目添

我有以下代码:

       foreach (var item in ListView1.Items)
            {
                ListView1.Items.Remove(item);
                ListView21.Items.Add(item);
            }
循环在一半的项目上停止

有什么想法吗

编辑

好吧,也许是我的错,我需要澄清这是Infrajistics的UltraListView控件,在这里我不能将项目添加到另一个列表中,除非我将其从原始列表中删除或克隆

但是,谢谢,关于不要修改循环中的列表的大多数评论都是正确的,因此此代码可以工作:

           foreach (var item in listView1.Items)
            {
                var i = item.Clone(true);
                listView2.Items.Add(i);
            }
            listView1.Items.Clear();

谢谢,

您正在修改正在循环的收藏。尝试从上到下使用
for
语句(从索引最高的项到0)


您不能修改迭代的集合,它将异常终止(或以未定义的行为终止)。 尝试制作阵列的副本:

   foreach (var item in ListView1.Items.ToArray())
   {
       ListView1.Items.Remove(item);
       ListView21.Items.Add(item);
   }
编辑:

事实上,您的示例代码可以通过以下方式实现:

ListView21.Items.AddRange(ListView1.Items);
ListView1.Items.Clear();

(事实上,这并不完全是您正在做的事情,但给出了相同的结果,我认为在两个ListView中都有相同的内容不会影响您)。由于.NET2.0支持后者,第一个解决方案需要linq,因此.NET3.5也需要linq。

您是否收到任何异常或错误消息?在一个集合中循环并从同一集合中删除项目总是一个坏主意。

这是因为您正在循环中更改集合。 使用法线for循环,如下所示:

for(int i=0; i < ListView1.Items.Count-1; i++)
{
       ListView21.Items.Add(ListView1.Items[i]);
       ListView1.Items.RemoveAt(i);
}
for(int i=0;i
它将导致运行时异常,抱怨在遍历集合时无法修改集合。您必须将
改为用于
循环

for(int index = Items.Count; index > 0; index--)
{
    .......
    // use Add and RemoveAt
}

编辑:如他人所述。如果您只需要将项目从一个集合移动到另一个集合
AddRange
Clear
会更好。

这看起来像WinForms列表视图控件,因此:

ListViewItem[] items = ListView1.Items.ToArray();
ListView1.Items.Clear();
ListView21.Items.AddRange(items);

为什么不先创建新列表,然后创建项目?

您正在遍历所有项目,删除所有项目,然后将它们添加到另一个列表中。正如其他人所评论的,您不能从for each中的列表中删除项目。为什么不循环浏览所有项目,将它们添加到其他列表中,然后一次性删除它们

foreach (var item in ListView1.Items)
{
    ListView21.Items.Add(item);
}
ListView1.Items.Clear();   // remove all

PS:这是ASP.NET listview还是WinForms listview?

正在将项目从列表1移动到列表2!CopyTo()/AddRange()+Clear()然后是ASP.net还是winforms?我已经添加了WinForms作为更可能的候选,但是如果这是错误的,请更正它。可能有点吹毛求疵,但是
ListView
项本身没有
ToArray
方法。谢谢,第一个方法无法工作,因为没有ToArray。我将尝试第二个方法如果您添加对LINQ的引用,它将工作,使用System.Linq和(仅当)使用.NET 3.5或更高版本时,添加一个using语句
using。您只需在
ToArray()
之前添加
Cast()
,即可获得一个通用的
IEnumerable
包装
IEnumerable
。我上次编辑的内容涵盖了第一个建议有效时的情况。(.NET3.5,linq)因为Items是一个集合,所以它将修复listview中的项索引。移除(0),将所有项移到开始位置,移除(1)将移除项3(原始索引为2,现在为1)。若要修复此问题,请在集合中从最后一个项迭代到第一个项,然后它将起作用<代码>用于(int i=ListView1.Items.Count-1;i>=0;i--)
。此外,为了保持正确的顺序,您必须在索引0处插入,而不是添加到末尾;对于(int i=itemCount-1;i>=0;i--){var item=ListView1.Items[i];ListView1.Items.Remove(item);ListView21.Items.Insert(0,item);}。。。我讨厌我的方法创建新的列表来存储删除的项目和所有。。。
foreach (var item in ListView1.Items)
{
    ListView21.Items.Add(item);
}
ListView1.Items.Clear();   // remove all