我有一组组件,其中组件名称对于每个组件都是唯一的。当用户向此集合添加新组件时,组件名称应增加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”的ComponentName,以确保名称与其余组件不同。
答案 0 :(得分:0)
通常,当您在集合中添加元素时,您的代码可以正常工作,但总是在一个方向上。问题是当你删除一些元素时会发生什么?在那种情况下,你的计数器是没用的,但他仍然做得很好,这意味着你需要改变整个逻辑。
在数据库中,我们有自动增量ID ,但即使这样,您也永远不会看到 id 会填补删除行所造成的空白。那个柜台将永远直截了当。你需要实现类似的东西,或者你需要制作一个帮助方法,它将迭代思想组件的名称和名称中的减号(名称中的最后一个字符)。
正如您所看到的,这个解决方案在许多方面都不是很好(OOP,扎实和干净的代码原则),所以我建议重构您的解决方案。
答案 1 :(得分:0)
您的代码不起作用,因为您的要求相互矛盾。您声明新组件的指定名称应该: 1)是现有组件的+数量 2)独一无二p>
正如您所说,很容易想象出一种情况,即您无法同时拥有这两种情况。在您的示例中,您应该为新添加的组件命名' ComponentName 4' (这不是唯一的)或提出一些独特的名称,但这不会是现有项目的数量。
因此,您的要求无法满足。不是因为糟糕的算法或错误的ID生成策略或其他原因,仅仅因为要求不一致。如果您将解决方案重构为核心,那将无济于事:这是问题所在的要求,而不是解决方案。
您必须决定哪一个对您不那么重要,并且允许使用非唯一名称,或者不要求在已存在的组件之后命名新添加的组件。或者,也许,想出一些完全不同的命名策略。