c#将连接项的列表排序为多个列表
本文关键字:列表 排序 连接 | 更新日期: 2023-09-27 18:10:19
是否有可能将对象列表排序为相互关联的多组对象?
模型:
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 });
}
我要归档的是一个相互关联的项目列表的列表
文物
——1、2、3、4、5
-Collection2
——6、7、8
-Collection3
——9、10
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},
};
你要做的是找到你的模型所暗示的图的连接组件。可以通过从一个节点执行DFS来找到连接的组件,DFS完成后,继续查找尚未找到的节点。我假设你有一个数组或列表L
的所有项目;我还添加了一个访问过的属性项。
现在您有一个有向图(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);
}
}