16,554
社区成员
发帖
与我相关
我的任务
分享
Dictionary<int, List<int>> dic = new Dictionary<int, List<int>>();
List<int> a1 = new List<int>() { 4, 5, 6, 7 };
List<int> a2 = new List<int>() { 1, 2, 4, 8 };
List<int> a3 = new List<int>() { 9, 10, 11, 12 };
List<int> a4 = new List<int>() { 3, 13, 21, 22 };
dic.Add(1, a1);
dic.Add(2, a2);
dic.Add(3, a3);
dic.Add(4, a4);
Action<List<int>> call = null;
call = lst =>
{
if (lst.Count == 4)
{
Console.WriteLine(string.Join(",", lst));
}
else
{
int last = lst.Last();
var lst2 = dic[lst.Count+1].Where(c => c > last);
foreach (var i in lst2)
{
var newlist = new List<int>(lst);
newlist.Add(i);
call(newlist);
}
}
};
call(new List<int>{5});
当然,我个人说别太过纠结,最原始的笛卡儿积是最好的,你也看到了。上面那个linq 就是循环256次,而我后面怎么写其实都不会比他更好,因为where难道不需要循环?同时我还得构造递归的参数,so,别总跟XX园学习纠结。现在的XX园那么多别的语种的好思想,好手段不学。整天跟XX园那波玩net的学纠结可不是好习惯 Subject<List<int>> subject = new Subject<List<int>>();
List<int> a1 = new List<int>() { 4, 5, 6, 7 };
List<int> a2 = new List<int>() { 1, 2, 4, 8 };
List<int> a3 = new List<int>() { 9, 10, 11, 12 };
List<int> a4 = new List<int>() { 3, 13, 21, 22 };
subject.Where(p => p.Count == 4).Subscribe(p =>
{
Console.WriteLine(string.Join(",",p));
});
subject.Where(p => p.Count == 1).Subscribe(p =>
{
var temp = p.Last();
var target = a2.Where(c => c > temp);
foreach (var i in target)
{
List<int> lst = new List<int>(p);
lst.Add(i);
subject.OnNext(lst);
}
});
subject.Where(p => p.Count == 2).Subscribe(p =>
{
var temp = p.Last();
var target = a3.Where(c => c > temp);
foreach (var i in target)
{
List<int> lst = new List<int>(p);
lst.Add(i);
subject.OnNext(lst);
}
});
subject.Where(p => p.Count == 3).Subscribe(p =>
{
var temp = p.Last();
var target = a4.Where(c => c > temp);
foreach (var i in target)
{
List<int> lst = new List<int>(p);
lst.Add(i);
subject.OnNext(lst);
}
});
subject.OnNext(new List<int>{5});
Console.ReadKey();
结果
static void Main(string[] args)
{
List<int> a1 = new List<int>() { 4,5,6,7};
List<int> a2 = new List<int>() { 1,2,4,8 };
List<int> a3 = new List<int>() { 9,10,11,12 };
List<int> a4 = new List<int>() { 3, 13, 21, 22 };
var q = from x1 in a1
from x2 in a2
from x3 in a3
from x4 in a4
where x1<x2 && x2<x3 && x3<x4
select $"{x1},{x2},{x3},{x4}";
Console.WriteLine(q.Count());
Console.WriteLine("==============");
Console.WriteLine(string.Join(" \r\n", q));
Console.ReadLine();
}