You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现两个Inventory对象的Items列表间随机元素交换技术求助

实现两个Inventory对象间的随机元素交换

没问题,我来帮你搞定这个随机交换的需求!首先得先修正原代码里的一个小问题,再一步步实现交换逻辑:

1. 修正Inventory类的属性问题

你原代码里的Inventory类存在字段和属性不一致的问题:构造函数初始化的是私有items字段,但Items属性是自动实现的(背后有自己的私有字段),这会导致myInv.Items根本不是你构造函数里初始化的那个列表。我们把它改成只读属性直接初始化,避免这个bug:

public class Item
{
    // 补全Item类的定义,确保有Name属性和ToString方法方便显示
    public string Name { get; }

    public Item(string name)
    {
        Name = name;
    }

    public override string ToString()
    {
        return Name;
    }
}

public class Inventory
{
    // 改成只读属性,直接初始化列表
    public List<Item> Items { get; } = new List<Item>();

    public Inventory()
    {
        // 直接往Items属性里添加初始物品
        Items.AddRange(new List<Item> 
        { 
            new Item("Ipod"), 
            new Item("Samsung"), 
            new Item("Motorolla"), 
            new Item("Huawei") 
        });
    }

    // 重写ToString方法,让ListBox能显示库存里的物品列表
    public override string ToString()
    {
        return string.Join(", ", Items.Select(item => item.Name));
    }
}

2. 实现随机交换方法

我们在Form类里写一个专门的交换方法,注意要复用同一个Random实例(避免频繁创建导致重复随机数):

// 在Form类的顶部定义静态Random实例,确保全局唯一
private static readonly Random _random = new Random();

private void SwapRandomItems(Inventory inv1, Inventory inv2)
{
    // 先判断两个库存是否都有可交换的元素
    if (inv1.Items.Count == 0 || inv2.Items.Count == 0)
    {
        MessageBox.Show("至少有一个库存是空的,无法完成交换!");
        return;
    }

    // 生成两个随机索引,分别对应两个库存里的元素
    int randomIndex1 = _random.Next(inv1.Items.Count);
    int randomIndex2 = _random.Next(inv2.Items.Count);

    // 执行交换逻辑
    Item tempItem = inv1.Items[randomIndex1];
    inv1.Items[randomIndex1] = inv2.Items[randomIndex2];
    inv2.Items[randomIndex2] = tempItem;

    // 刷新ListBox,让交换后的结果立即显示出来
    lstBox.Refresh();
}

3. 初始化ListBox并触发交换

修改你的Form1_Load方法,确保ListBox能正确显示库存内容;然后添加一个按钮(比如命名为btnSwap),点击时触发交换:

private void Form1_Load(object sender, EventArgs e)
{
    var myInv = new Inventory();
    var myInv2 = new Inventory();

    // 添加两个库存到ListBox
    lstBox.Items.Add(myInv);
    lstBox.Items.Add(myInv2);
}

// 按钮点击事件,触发随机交换
private void btnSwap_Click(object sender, EventArgs e)
{
    // 确保ListBox里有两个Inventory对象
    if (lstBox.Items.Count >= 2)
    {
        var inv1 = lstBox.Items[0] as Inventory;
        var inv2 = lstBox.Items[1] as Inventory;

        if (inv1 != null && inv2 != null)
        {
            SwapRandomItems(inv1, inv2);
        }
    }
}

这样每次点击按钮,两个库存就会随机交换一个元素,ListBox也会实时更新显示结果啦!

内容的提问来源于stack exchange,提问作者iStudent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:38:10