从我的列表框中删除重复项,然后根据重复次数再次添加

本文关键字:添加 然后 列表 我的 删除 | 更新日期: 2023-09-27 17:58:37

我正在构建一个销售点系统。我使用了一个为我的产品创建按钮的FlowLayoutPanel。因此,一旦我点击该按钮,它就会将产品转移到listbox。现在我纠结于如何输入该产品的数量?

我试着用数字做一个表格(比如计算器),当我按下按钮时,它会弹出,但我做不到。所以现在我有了这样的想法,例如,如果我点击某个产品的按钮两次,而不是把它放在listbox中两次,而是把它放一次,然后把2放在数量列中。

所以我想我需要一个循环,每次点击按钮都会循环。这可能吗?

请帮助我,任何想法或意见都将不胜感激。提前谢谢。

这是关于"ListBox"的所有代码:

public RegisterForm()
    {
        InitializeComponent();
        this.WindowState = FormWindowState.Maximized;
        ChosenProductsList.DataSource = products;
        ChosenProductsList.DisplayMember = "Name";
        CreateTappedPanel();
        AddProdToTapPanel();
    }
void UpdateProductList (object sender, EventArgs e)
    {            
        Button b = (Button)sender;                           
        ProductTBL p = (ProductTBL)b.Tag;                   
        products.Add(p);
        ChosenProductsList.SelectedIndex = ChosenProductsList.Items.Count - 1;                   
    }
private void FormatListItem(object sender, ListControlConvertEventArgs e)
    {
        string CurrentName = ((ProductTBL)e.ListItem).Name;
        string currentPrice = String.Format("{0:c}", ((ProductTBL)e.ListItem).Price);
        string currentNamePadded = CurrentName.PadRight(20);
        e.Value = currentNamePadded + currentPrice;
    }

从我的列表框中删除重复项,然后根据重复次数再次添加

使用LINQ,您可以通过Distinct()、Select()和Count()方法轻松实现这一点:

示例:

internal class VideoGame
{
    public string Name { get; set; }
}
var game1 = new VideoGame {Name = "MegaMan"};
var game2 = new VideoGame {Name = "Super Mario Bros"};
var game3 = new VideoGame {Name = "Kirby"};
var list = new List<VideoGame>();
list.Add(game1);
list.Add(game2);
list.Add(game2);
list.Add(game3);
list.Add(game3);
list.Add(game3);
IEnumerable<VideoGame> videoGames = list.Distinct();
var enumerable = videoGames.Select(s => new {VideoGame = s, Count = list.Count(t => t.Name == s.Name)});

现在我将enumerable转换为字符串,这样您就可以看到结果:

var @join = string.Join(Environment.NewLine, enumerable.Select(s => string.Format("VideoGame: {0}, Count: {1}", s.VideoGame.Name, s.Count)));

输出:

VideoGame: MegaMan, Count: 1
VideoGame: Super Mario Bros, Count: 2
VideoGame: Kirby, Count: 3

请注意,我使用了匿名类型,但您可以使用自己的类型。

我留给您更新ListBox的任务,应该很容易做到:D

使用listbox,它的主要优点之一是可以接受任何对象作为项。这意味着您可以创建自己的对象,覆盖ToString方法以显示所需的数据,如果希望返回所选项,只需将其强制转换回原始类型即可。

public class Item
{
    public string name = "";
    public int count = 0;
    public override string ToString()
    {
        return name;
    }
}

创建Item 列表

List<Item> items = new List<Item>()
{
    new Item{name = "A", count = 1},
    new Item{name = "B", count = 1},
};

填充列表框。使用ToString方法

listbox1.DataSource = items;

要增加计数,请在Items集合中找到该项,将其强制转换为Item并增加count属性使用所选项目

Item pickeditem = (Item)listbox1.SelectedItem;
相关文章: