好的,所以我不完全确定哪个标题适合我的问题,但描述如下:
我有一些对象不能引用其他对象,以创建下拉列表,其中内容/值取决于在“父”下拉列表中选择的值。
我的下拉对象包含一个 id 和一个 parentId(和其他东西,这里不相关)。
我想防止用户进行无限循环,如下所示:
清单 1(取决于清单 3)
清单 2(取决于清单 1)
清单 3(取决于清单 2)
我尝试编写递归方法来防止它,但我无法弄清楚逻辑。
谁能告诉我你将如何确保一个对象不引用它自己“下线”?或者提供一个例子。
任何帮助深表感谢。
好的,所以我不完全确定哪个标题适合我的问题,但描述如下:
我有一些对象不能引用其他对象,以创建下拉列表,其中内容/值取决于在“父”下拉列表中选择的值。
我的下拉对象包含一个 id 和一个 parentId(和其他东西,这里不相关)。
我想防止用户进行无限循环,如下所示:
清单 1(取决于清单 3)
清单 2(取决于清单 1)
清单 3(取决于清单 2)
我尝试编写递归方法来防止它,但我无法弄清楚逻辑。
谁能告诉我你将如何确保一个对象不引用它自己“下线”?或者提供一个例子。
任何帮助深表感谢。
我能想到的最简单的方法是创建一个扁平列表。递归迭代对象并将每个引用存储在列表中。当您发现新对象时,请检查列表中的每个对象。
您将遇到引用自身的对象或用完要搜索的对象。
这种方法是否合适取决于您的要求、速度/内存/列表中的项目数。
由于所有对象都包含一个 id 列表可以存储/检查,而不是如果您需要检查值相等而不是引用相等
如果您编写了一个递归函数来管理这些列表,一种解决方案可能是创建一个元素列表并将其作为参数传递给递归函数,然后每次迭代都将当前项目添加到列表中。要停止递归函数,只需检查当前项目是否先前已添加到列表中。
感谢大家对此的意见。我使用列表接受了 James 的建议,最后得到了以下代码(这对除我以外的其他人可能有意义,也可能没有意义)
public static bool BadParent(int fieldId, int childId, List<int> list)
{
if (list == null)
list = new List<int>();
bool returnValue = true;
var field = EkstraFelterBLL.getEkstraFeltUdfraEkstraFeltId(fieldId);
if (field != null)
{
if (field.ParentEkstraFeltId == childId)
returnValue = false; //loop reference, fail
else if (list.Contains(field.EkstraFeltId))
returnValue = false; //already been in the cycle, fail
else
{
list.Add(field.EkstraFeltId);
returnValue = BadParent(field.ParentEkstraFeltId, childId, list);
}
}
return returnValue;
}
如果您通过依赖每个列表的特定计数器来遍历每个列表的实际元素,您应该不会发现任何问题。引发无限循环的最可能方法是从外部源更改计数器的值。例子:
for(int i = 0; i < max_i; i++)
{
if(val1[i] != null)
{
for(int j = 0; j < max_j; j++)
{
if(val2[j] != null)
{
//Delete or anything
//YOU CANNOT AFFECT NEITHER i NOR j DIRECTLY.
}
}
}
如果要考虑j内部部分的不同值,则应依赖不同的变量。例子:
if(val2[j] != null)
{
int j2 = j;
//Do whatever with j2, never with j
}
通过这样做(将不同的计数器关联到不同的循环),不会发生无限循环。无限循环发生在以下情况:i = 1, 2, 3, 4突然i被“外部源”更改为 2;i因此解决方案:除了通过 for 循环之外,切勿更改。