编程语言
首页 > 编程语言> > c# – 在列表中查找循环引用的最有效方法

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