有没有办法从引用类型获取值?

时间:2019-11-28 09:57:26

标签: vb.net

我正在尝试将所选项目从一个列表移动到另一个列表。

此代码不起作用,因为“ 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

2 个答案:

答案 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;
    }

}