【问题标题】:c# sort list of connected items into multiple listsc#将连接项的列表排序为多个列表
【发布时间】:2015-11-24 07:39:07
【问题描述】:

可以将对象列表排序为多个相互关联的对象组吗?

型号:

public class Item
{
   public string Name {get;set;}
   public List<Item> ConnectedItem {get;set;}
}

数据:

    public void Data()
    {
        Item One = new Item() {};
        Item Two = new Item() { };
        Item Three = new Item() { };
        Item Four = new Item() { };
        Item Five = new Item() { };
        Item Six = new Item() { };
        Item Seven = new Item() { };
        Item Eight = new Item() { };
        Item Nine = new Item() { };
        Item Ten = new Item() { };

        One.ConnectedItem = new List<Item>(){Two,Three, Five};
        Two.ConnectedItem = new List<Item>() { One, Five };
        Three.ConnectedItem = new List<Item>() { Five, Two };
        Four.ConnectedItem = new List<Item>() { One, Two };
        Five.ConnectedItem = new List<Item>() { Four, One, Two ,Three };

        Six.ConnectedItem = new List<Item>() { Eight };
        Seven.ConnectedItem = new List<Item>() { Eight };
        Eight.ConnectedItem = new List<Item>() { Six };

        Nine.ConnectedItem = new List<Item>() { Ten };
        Ten.ConnectedItem = new List<Item>() { Nine};

        List<Item> items = new List<Item>(new List<Item>() {One,Two,Three,Four,Five,Six,Seven,Eight,Nine,Ten });


    }

我要归档的是相互关联的项目列表

-Collection1
----一、二、三、四、五

-Collection2
----六七八

-Collection3
----九、十

        List<List<Item>> sortedList = new List<List<Item>>()
        {
            new List<Item>() {One, Two,Three,Four,Five},
            new List<Item>() {Six,Seven,Eight},
            new List<Item>() {Nine,Ten},
        };

【问题讨论】:

  • 我认为您需要详细说明究竟是什么使元素符合包含在这些集合之一中的条件。很可能有一种图论算法可以有效地确定这一点,但是如果没有指定精确的要求,人们将很难为您提供帮助。就此而言,您到目前为止尝试过什么?你比我们更了解这个问题,它的哪一部分让你绊倒了?推测,这看起来像你试图找到连接的传递闭包。有一些有效的方法来计算。
  • 符合包含条件的是对每个 ConnectedItem 属性的引用。如果元素是链接的,那么它将引用另一个元素。我试图写一个递归方法,但碰壁了。任何帮助表示赞赏

标签: c# .net algorithm sorting tree


【解决方案1】:

您要做的是找到模型所暗示的图形的连通分量。从一个节点做DFS可以找到连通的组件,在DFS完成后,你继续寻找一个尚未找到的节点。我假设你有一个数组或列表中的所有项目L;我还向 Item 添加了一个 Visited 属性。

现在您有了一个有向图(Item1 可能指向 Item2 而 Item2 不指向 Item1)。显然,您正在寻找的是通过删除链接上的方向获得的图形的连通分量。

List<List<Item>> components = new List<List<Item>>();
for (int i = 0; i < L.Count; i++)
{
    if (L.Visited) 
        continue;
    var component = new List<Item>();
    DFS(L[i], component);
    components.Add(component);
}

和方法DFS:

static void DFS(Item item, List<Item> component)
{
    if (component.Contains(item))
        return;
    component.Add(item);
    item.Visited = true;
    foreach (var i in item.ConnectedItems)
    {
         if (!i.Visited)
             DFS(i, component);
    }
    foreach (var i in L)
    {
        if (!i.Visited && i.ConnectedItems.Contains(item))
            DFS(i);
    }
}

【讨论】:

  • 何时应该插入 L.Visited = true?
  • 知道了,非常感谢!
  • 哎呀。谢谢,我改进了。
猜你喜欢
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 2022-08-09
  • 1970-01-01
相关资源
最近更新 更多