c# – 在列表中查找循环引用的最有效方法
作者:互联网
给出以下重定向列表
[
{
"old": "a",
"target": "b"
},
{
"old": "b",
"target": "c"
},
{
"old": "c",
"target": "d"
},
{
"old": "d",
"target": "a"
},
{
"old": "o",
"target": "n"
},
{
"old": "n",
"target": "b"
},
{
"old": "j",
"target": "x"
},
{
"old": "whatever",
"target": "something"
}
]
在这里我们可以看到第一个项“a”应该重定向到“b”.
如果我们按照列表,我们可以看到以下模式:
a -> b
b -> c
c -> d
d -> a
所以我们最终会得到一个循环引用,因为“a”最终会指向“d”而“d”指向“a”.
找到循环引用的最有效方法是什么?
我在C#中提出了以下算法
var items = JsonConvert.DeserializeObject<IEnumerable<Item>>(json)
.GroupBy(x => x.Old)
.Select(x => x.First())
.ToDictionary(x => x.Old, x => x.Target);
var circulars = new Dictionary<string, string>();
foreach (var item in items)
{
var target = item.Value;
while (items.ContainsKey(target))
{
target = items[target];
if (target.Equals(item.Key))
{
circulars.Add(target, item.Value);
break;
}
}
}
这将给我一个包含4个项目的列表,如下所示:
[
{
"old": "a",
"target": "b"
},
{
"old": "b",
"target": "c"
},
{
"old": "c",
"target": "d"
},
{
"old": "d",
"target": "a"
}
]
但我只想告诉用户类似的东西
“嘿,你不能这样做,它将是一个循环引用,因为”a“指向”b“指向”c“指向”d“指向”a“
那么,你们有什么建议吗?
我确定存在其他一些(更好的)算法…
标签:c,algorithm,circular-reference,cycle-detection 来源: https://codeday.me/bug/20190701/1348825.html