繁体   English   中英

在集合C#中查找循环依赖项

[英]Find a circular dependency in a collection c#

我有一个DataItem类的集合。

DataItem: Property RefItem将ref存储到可能是同一集合的DataItem

public class DataItem
{
    public int ID { get; set; }
    public string Name { get; set; }
    public DataItem RefItem { get; set; }
}

采集:

 private List<DataItem> dataitems;

    public List<DataItem> DataItems
    {
        get { return dataitems; }
        set { dataitems = value; }
    }

现在,我有两种方法可以在集合中添加数据并验证集合中的数据。

 public void AddItem(DataItem item)
    {
        DataItems.Add(item);
    }

    public bool ValidateDataItems()
    {
        //Logic for circular reference
        //
        return true;
    }

我想要validate方法中的算法来检查我的集合中是否存在任何循环依赖关系。 以下是对我无效的数据。 由于item3再次由item1指向。

       var item1 = new DataItem() {ID=1,Name="First Item",RefItem =null};
        var item2 = new DataItem() { ID = 1, Name = "First Item", RefItem = item1 };
        var item3 = new DataItem() { ID = 1, Name = "First Item", RefItem = item2 };
        item1.RefItem = item3;
        AddItem(item1);
        AddItem(item2);
        AddItem(item3);

如果将项添加到集合中,例如Item1-> item2,item2-> item3,item3-> item1或类的引用项指向其后的位置的任何其他可能组合。 我希望验证方法返回false。

这是一个循环依赖问题,但是我在c#中找不到任何具体的算法可以做到这一点。

试试这样的解决方案

public class DataItem
{
    public int ID { get; set; }
    public string Name { get; set; }
    public DataItem RefItem { get; set; }
}    

public class Checker
{
    public static bool Check(DataItem item)
    {
        var chain = new Dictionary<DataItem, DataItem>();
        chain.Add(item, null);
        try
        {
            ProcessNodes(chain, item);
            return true;
        }
        catch (ArgumentException)
        {
            return false;
        }
    }

    private static void ProcessNodes(Dictionary<DataItem, DataItem> chain, DataItem item)
    {
        if (item.RefItem != null)
        {                
            chain.Add(item.RefItem, null);
            ProcessNodes(chain, item.RefItem);
        }
    }

    public static bool ValidateDataItems(List<DataItem> items)
    {
        foreach(var item in items)
            if(!Check(item))
                return false;
        return true;                
    }
}

public static void Main()
{
    var item1 = new DataItem() { ID = 1, Name = "First Item", RefItem = null };
    var item2 = new DataItem() { ID = 1, Name = "First Item", RefItem = item1 };
    var item3 = new DataItem() { ID = 1, Name = "First Item", RefItem = item2 };
    item1.RefItem = item3;

    Console.WriteLine(Checker.Check(item1));
    item1.RefItem = null;
    Console.WriteLine(Checker.Check(item1));

    //Sample how to check all existing items    
    Console.WriteLine(Checker.ValidateDataItems(new List<DataItem>{item1, item2, item3}) ? "items is OK" : "One or more items have dependency");        
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM