c# - 如何对连接对列表进行分组

标签 c# nodes graph-theory edges

我有一个从 X 到 Y 的连接列表,如下所示:-

public class Connection
{
    private int X { get; set; }
    private int Y { get; set; }

    public Connection(int X, int Y)
    {
        this.X = X;
        this.Y = Y;
    }
}


List<Connection> connectionList = new List<Connection>();

connectionList.Add(new Connection(1, 2));
connectionList.Add(new Connection(1, 3));
connectionList.Add(new Connection(1, 4));
connectionList.Add(new Connection(2, 1));
connectionList.Add(new Connection(2, 3));
connectionList.Add(new Connection(2, 4));
connectionList.Add(new Connection(3, 1));
connectionList.Add(new Connection(3, 2));
connectionList.Add(new Connection(4, 1));
connectionList.Add(new Connection(4, 2));
connectionList.Add(new Connection(5, 6));

我现在想从 connectionList 中知道我有哪些 groups。例如,这里有两个表示上述数据的连接图。

connected graph

程序的预期输出将是两组,A(1, 2, 3 4) 和 B(5, 6)。

最好的方法是什么?

最佳答案

这个怎么样;

var groups = new List<List<int>>();
foreach (var con in connectionList)
{
    if(!groups.Any(g => g.Contains(con.X) || g.Contains(con.Y)))
    {
        groups.Add(new List<int>() { con.X, con.Y }); //con.X is not part of any group, so we can create a new one with X and Y added, since both a are in the group       
    } 
    else 
    {
        var group = groups.First(g => g.Contains(con.X) || g.Contains(con.Y));
        if(!group.Contains(con.X)) group.Add(con.X);
        if(!group.Contains(con.Y)) group.Add(con.Y);
    }
}

这是我凭空想到的,也没有测试。目的很简单;

  • 如果任何组中都不存在 X 和 Y,则添加一个新组。
  • 如果 X 或 Y 存在于一个组中,则 Y 或 X 也应该是该组的一部分,因此将其添加。

鉴于您的情况,这应该给您两个列表;一个是 (1,2,3,4),一个是 (5,6)。

编辑:点击here查看结果。

关于c# - 如何对连接对列表进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33434718/

相关文章:

c# - Outlook:使用新扩展名保存 TFS-PBI 会锁定 PBI

c# - 查询选项无法应用于请求的资源

c# - MSBuild 自定义规则

c++ - 双链表删除带索引的节点 C++

c++ - 获取二叉搜索树中的节点数

algorithm - 如何通过添加最小边数来增加图中最小切割的大小

graph-theory - 寻找图中的循环

javascript - 如何找到 100 个移动目标之间的最短路径? (包括现场演示。)

c# - 如何在 Entity Linq to SQL 中获取不同的列表

json - 使用 `npm update`时如何更新package.json中的所有包版本号?