Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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# 添加到ObservableCollection时的增量属性名称_C#_List_If Statement_Foreach_Observablecollection - Fatal编程技术网

C# 添加到ObservableCollection时的增量属性名称

C# 添加到ObservableCollection时的增量属性名称,c#,list,if-statement,foreach,observablecollection,C#,List,If Statement,Foreach,Observablecollection,我有一个组件集合,其中每个组件的组件名称都是唯一的。当用户向该集合添加新组件时,组件名称应增加1,具体取决于现有组件的数量。当用户删除组件时,为新添加的组件指定的组件名称仍应是唯一的 现在我正在循环集合中的组件,以获取每个组件的总量,并为每个组件增加计数器,该计数器等于要添加的组件 private void OnComponentAdded() { if (SelectedComponent != null) {

我有一个组件集合,其中每个组件的组件名称都是唯一的。当用户向该集合添加新组件时,组件名称应增加1,具体取决于现有组件的数量。当用户删除组件时,为新添加的组件指定的组件名称仍应是唯一的

现在我正在循环集合中的组件,以获取每个组件的总量,并为每个组件增加计数器,该计数器等于要添加的组件

private void OnComponentAdded()
        {
            if (SelectedComponent != null)
            {
                var numberOfDuplicates = 0;
                foreach (var item in ComponentsForEquipment)
                {
                    if (item.ComponentId == SelectedComponent.ComponentId)
                    {
                        numberOfDuplicates++;
                    }
                }
                numberOfDuplicates++;
                SelectedComponent.ComponentName = SelectedComponent.ComponentType + numberOfDuplicates.ToString();

                var match = ComponentsForEquipment.Where(c => c.ComponentName == SelectedComponent.ComponentName).SingleOrDefault(); //componentname already exists
                if (match == null)
                {
                    ComponentsForEquipment.Add(SelectedComponent);
                }
            }
            else
            {
                MessageBox.Show("Please select a component before adding.", "Message", MessageBoxButton.OK, MessageBoxImage.Information);
            }

        }
但是,如果用户删除一个组件,然后再次添加它,那么组件名称将不是唯一的。因此,我添加了if语句来检查组件名称是否匹配。问题是,如果用户删除以前添加的组件,则生成的新名称将不唯一

以下是集合中重复组件的示例:


因此,如果集合中有3个重复的组件,则添加的第4个组件应该有一个组件名,末尾应附加4个组件名,以确保名称与其他组件唯一。

通常情况下,当您在集合中不断添加元素时,您的代码可以工作,但始终在一个方向上。问题是移除某些元素时会发生什么?在这种情况下,你的计数器是无用的,但他仍然做得很好,所以这意味着你需要改变整个逻辑

在数据库中,我们有自动递增的id,但即使这样,您也不会看到该id将通过删除行来填补空白。那个柜台总是向前走。您需要实现类似的东西,或者您需要创建一个helper方法,该方法将迭代具有相同名称的思想组件,并减少它们名称中的数字,即名称中的最后一个字符


正如你所看到的,这个解决方案在很多方面都不太好——面向对象、可靠和干净的代码原则,所以我建议重构你的解决方案。

你的代码不起作用,因为你的需求相互矛盾。您声明为新组件指定的名称应: 1是某物+已存在组件的数量 2.要独一无二

正如你所说的,很容易想象一种情况,当你不能同时拥有它们时。就像在您的示例中一样,您应该将新添加的组件命名为“ComponentName 4”,它不是唯一的,或者使用一些唯一的名称,但这不会是现有项目的数量

因此,您的要求无法满足。不是因为糟糕的算法或错误的ID生成策略或其他原因,那只是因为需求不一致。如果你将解决方案重构到核心,那是没有帮助的:问题所在是需求,而不是解决方案


您必须决定哪一个对您来说不那么重要,或者允许使用非唯一的名称,或者不要求新添加的组件以现有组件的数量命名。或者,也许,想出一些完全不同的命名策略

首先检查收集,也许你们永远不会进入循环。调试check if语句,因为您的计数器为1,所以这意味着计数器在foreach循环后只递增一次。是否可以选择让计数器表示下一个ID,并在每次添加项时递增它?这意味着您永远不会得到重复项,但如果删除某个项,您可能会在ID中得到“间隙”。