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