我正在尝试将所选项目从一个列表移动到另一个列表。
此代码不起作用,因为“ itemsToMove”是引用类型,不保存值,而是对该列表的引用。 因此,当我更改列表时,我会得到一个不可计数的异常。
Dim itemsToMove = FullList.SelectedItems()
For Each item As Object In itemsToMove
GroupList.Items.Add(item)
FullList.Items.Remove(item)
Next
是否有一种方法可以告诉“ itemsTomove”采用FullList.SelectedItems()的值而不是对内存的引用?基本上克隆该列表?
我做了一些研究,发现了一些术语,例如“装箱”和“取消装箱”,但我真的不知道这是否有意义。
如果我做不到,那是否意味着这是做我想要的唯一(最干净的)方法?
Dim itemsToMove As Collection = New Collection()
For Each i As Object In FullList.SelectedItems()
itemsToMove.Add(i)
Next
For Each item As Object In itemsToMove
GroupList.Items.Add(item)
FullList.Items.Remove(item)
Next
答案 0 :(得分:1)
如果您想要引用类型的副本,则由您自己创建,是的。在这种情况下,您不会像显示的那样进行操作。您可以这样做:
For Each selectedItem In FullList.SelectedItems.Cast(Of Object)().ToArray()
FullList.Items.Remove(selectedItem)
GroupList.Items.Add(selectedItem)
Next
ToArray
方法是从IEnumerable(Of T)
创建数组的快速方法,而Cast(Of T)
从IEnumerable(Of T)
创建IEnumerable
。在这种情况下,由于源和目标都不关心特定的类型,因此您只需使用Object
。
答案 1 :(得分:-1)
我认为您可以使用AddRange和Clear方法 下面的示例在c#
中https://dotnetfiddle.net/USSfte
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
public class Program
{
private static List<String> _data = new List<String>();
private static void GenerateFakeData(){
_data.AddRange(Enumerable.Range(1,100).Select((e) => String.Format("fake_{0}",e)));
}
public static void Main()
{
GenerateFakeData();
List<string> GroupList= new List<string>();
Console.WriteLine("Before\t\tGroupList.Count:{0}\t_data.Count:{1}",GroupList.Count(),_data.Count());
GroupList = new List<String>();
var FullList = SelectedItems();
/*AddRange*/
GroupList.AddRange(FullList);
/*Clear*/
FullList.Clear();
Console.WriteLine("After\t\tGroupList.Count:{0}\t_data.Count:{1}",GroupList.Count(),_data.Count());
}
public static IList<String> SelectedItems(){
return _data;
}
}