举个栗子:
A B
C B
B D
B E
A E
E F
F G
A B
C B
B D
B E
A E
E F
F G
M N
o N
M N
上面的列表中A,B,C,D,E,F,G是有关的,这些人与M,N,O都没关系,本人要取出A,B,C,D,E,F,G这些人,问一下有什么方法可以取到,仅限C#程序或SQLServer数据库。
解决方案
5
取出数据后,设置起点,然后迭代就行了啊
void Demo(List<T> source,string find,Hashset<string> result) { var tmp = source.Where(t=>t.C1 == find); if(tmp.Any()) { result.Add(find);//这里需要判断下,hashset貌似直接Add会异常 foreach(var t in tmp) { Demo(source,t.C2,result); } } }
95
写了一个,由于按照最初始的理解来写代码,可能算法比较繁琐的(尚未进行任何重构)
using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApplication1 { class Program { class testClass { public testClass(string _c1, string _c2) { this.C1 = _c1; this.C2 = _c2; } public string C1 { get; set; } public string C2 { get; set; } } static void Main(string[] args) { List<testClass> listClass = new List<testClass>(); listClass.Add(new testClass("A", "B")); listClass.Add(new testClass("C", "B")); listClass.Add(new testClass("B", "D")); listClass.Add(new testClass("B", "E")); listClass.Add(new testClass("A", "E")); listClass.Add(new testClass("E", "F")); listClass.Add(new testClass("F", "G")); listClass.Add(new testClass("M", "N")); listClass.Add(new testClass("O", "N")); listClass.Add(new testClass("M", "P")); listClass.Add(new testClass("M", "Q")); int num = 0; foreach (var x in 分组(listClass)) { Console.Write("第{0}组:", ++num); foreach (var y in x) Console.Write("{0} ", y); Console.WriteLine(); } Console.WriteLine("..............按任意键结束"); Console.ReadKey(); } private static IEnumerable<List<string>> 分组(List<testClass> listClass) { var 全部人 = (from x in listClass select x.C1).Union(from x in listClass select x.C2); var 初始分组 = from x in 全部人 select new List<string> { x }; //先把每一个人独立做为一组 foreach (var x in 合并(初始分组.ToList(), listClass)) yield return x; } private static IEnumerable<List<string>> 合并(List<List<string>> 分组, List<testClass> 关系) { begin: if (分组.Count == 0) yield break; if (分组.Count == 1) { yield return 分组[0]; yield break; } var first = 分组.First(); var others = 分组.Skip(1); foreach (var x in others) { if (可以合并(first, x, 关系)) { x.AddRange(first); 分组 = others.ToList(); goto begin; //减少一个分组之后,进行迭代 } } yield return first; 分组 = others.ToList(); //输出找到的一个分组,然后继续迭代剩下的分组 goto begin; } private static bool 可以合并(List<string> x, List<string> y, List<testClass> 关系) { return (from a in x from b in y where 关系.Any(u => (u.C1 == a && u.C2 == b) || (u.C1 == b && u.C2 == a)) select a).Any(); } } }