添加到ObservableCollection时增加属性名称

问题描述 投票:-2回答:2

我有一个组件集合,其中组件名称对于每个组件都是唯一的。当用户向此集合添加新组件时,组件名称应增加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语句来检查组件名称的匹配。问题是如果用户删除以前添加的组件,则生成的新名称将不是唯一的。

以下是集合中重复组件的示例:enter image description here

因此,如果集合中有3个重复的组件,则第4个添加的组件应该在末尾附加一个“4”的ComponentName,以确保名称与其余组件不同。

c# list if-statement foreach observablecollection
2个回答
0
投票

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

在数据库中,我们有自动增量ID,但即使这样,你也永远不会看到id将通过删除行来填补空白。那个柜台将永远直截了当。你需要实现类似的东西,或者你需要制作一个帮助方法,它将迭代思想组件的名称和名称中的减号(名称中的最后一个字符)。

正如您所看到的,这个解决方案在很多方面都不是很好(OOP,扎实和干净的代码原则),所以我建议重构您的解决方案。


0
投票

您的代码不起作用,因为您的要求相互矛盾。您声明新组件的指定名称应该:1)是+已存在组件的数量2)是唯一的

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

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

您必须确定哪一个对您不那么重要,并且允许使用非唯一名称,或者不要求在已存在的组件之后命名新添加的组件。或者,也许,想出一些完全不同的命名策略。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.