a c e h j a d e h j a c f h j a d f h j a c g h j a d g h j a c e i j a d e i j a c f i j a d f i j a c g i j a d g i j Press any key to continue . . .
再给你个容易阅读点的版本 using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace ConsoleApplication1 { static class Enumerable { public static IEnumerable<IEnumerable<TSource>> Combo<TSource>(this IEnumerable<IEnumerable<TSource>> source, IEnumerable<TSource> second) { foreach (var i in second) { foreach (var j in source) { List<TSource> list = new List<TSource>(); list.Add(i); yield return j.Concat(list); } } } public static IEnumerable<IEnumerable<TSource>> StartCombo<TSource>(this IEnumerable<TSource> first) { foreach (var i in first) { List<TSource> list = new List<TSource>(); list.Add(i); yield return list; } } } class Program { static void Main(string[] args) { List<List<string>> list = new List<List<string>>() { new List<string>() { "a" }, new List<string>() { "c", "d" }, new List<string>() { "e", "f", "g" }, new List<string>() { "h", "i" }, new List<string>() { "j" } }; var result = list.Skip(1).Aggregate(list.First().StartCombo(), (serials, current) => serials.Combo(current), x => x).ToList(); result.ForEach(x => { x.ToList().ForEach(y => Console.Write(y + " ")); Console.WriteLine(); }); } } }
本帖最后由 caozhy 于 2011-06-07 09:01:52 编辑
lz,我给你帖子加了40分,记得这40分给10L.
既然标题是“求解一高效算法”怎么还有这么多用Linq实现的?
你在2楼不是说了吗...他是穷举结果,既然无法再高效为什么不能用Linq...
10楼大亮。 刚想说“这不是数据库join一下就好了嘛”,就发现给出了linq的方法,受教。
楼主可以一试.. List<List<string>> list = new List<List<string>>() { new List<string>() { "a" }, new List<string>() { "c", "d" }, new List<string>() { "e", "f", "g" }, new List<string>() { "h", "i" }, new List<string>() { "j" } }; var query= list.Aggregate(new string[] {""},(r,s)=>(from a in r from b in s select a+" "+b).ToArray()); query.ToList().ForEach(p => Console.WriteLine(p)); Console.ReadKey();
结果 /* a c e h j a c e i j a c f h j a c f i j a c g h j a c g i j a d e h j a d e i j a d f h j a d f i j a d g h j a d g i j */
static public void Slove() { List<List<string>> listArr = new List<List<string>>(){ new List<string>() { "a" }, new List<string>() { "c", "d" }, new List<string>() { "e", "f", "g" }, new List<string>() { "h", "i" }, new List<string>() { "j" } }; int Count = 1; listArr.ForEach(l => { Count *= l.Count; }); for (int i = 0; i < Count; ++i) { int t = 1; listArr.ForEach(l => { t *= l.Count; Console.Write(l[ (i/( Count/t )) % l.Count ]); }); Console.WriteLine(); }
a d e h j
a c f h j
a d f h j
a c g h j
a d g h j
a c e i j
a d e i j
a c f i j
a d f i j
a c g i j
a d g i j
Press any key to continue . . .
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication1
{
static class Enumerable
{
public static IEnumerable<IEnumerable<TSource>> Combo<TSource>(this IEnumerable<IEnumerable<TSource>> source, IEnumerable<TSource> second)
{
foreach (var i in second)
{
foreach (var j in source)
{
List<TSource> list = new List<TSource>();
list.Add(i);
yield return j.Concat(list);
}
}
} public static IEnumerable<IEnumerable<TSource>> StartCombo<TSource>(this IEnumerable<TSource> first)
{
foreach (var i in first)
{
List<TSource> list = new List<TSource>();
list.Add(i);
yield return list;
}
}
} class Program
{
static void Main(string[] args)
{
List<List<string>> list = new List<List<string>>()
{
new List<string>() { "a" },
new List<string>() { "c", "d" },
new List<string>() { "e", "f", "g" },
new List<string>() { "h", "i" },
new List<string>() { "j" }
};
var result = list.Skip(1).Aggregate(list.First().StartCombo(), (serials, current) => serials.Combo(current), x => x).ToList();
result.ForEach(x => { x.ToList().ForEach(y => Console.Write(y + " ")); Console.WriteLine(); });
}
}
}
刚想说“这不是数据库join一下就好了嘛”,就发现给出了linq的方法,受教。
{
new List<string>() { "a" },
new List<string>() { "c", "d" },
new List<string>() { "e", "f", "g" },
new List<string>() { "h", "i" },
new List<string>() { "j" }
};
var query= list.Aggregate(new string[] {""},(r,s)=>(from a in r from b in s select a+" "+b).ToArray());
query.ToList().ForEach(p => Console.WriteLine(p));
Console.ReadKey();
/*
a c e h j
a c e i j
a c f h j
a c f i j
a c g h j
a c g i j
a d e h j
a d e i j
a d f h j
a d f i j
a d g h j
a d g i j
*/
{
List<List<string>> listArr = new List<List<string>>(){
new List<string>() { "a" },
new List<string>() { "c", "d" },
new List<string>() { "e", "f", "g" },
new List<string>() { "h", "i" },
new List<string>() { "j" }
};
int Count = 1;
listArr.ForEach(l =>
{
Count *= l.Count;
});
for (int i = 0; i < Count; ++i)
{
int t = 1;
listArr.ForEach(l => {
t *= l.Count;
Console.Write(l[ (i/( Count/t )) % l.Count ]);
});
Console.WriteLine();
}
}