n个数组的组合

waitforyoueveryday 2011-01-10 02:01:17
大家帮忙想想用简单的方法实现以下功能
现在有一个类型为ArrayList的对象a,,这个a的长度不固定的,a里面的每个对象的类型也都是ArrayList,长度也不固定
现在想实现将得到这个a里面的所有对象连接的排列组合
我举个例子吧
假设a里面有3个ArrayList对象,分别是b,c,d,这些ArrayList中的都是字符串,假设b中为{"b1","b2","b3"},c中为{"c1","c2"},d中为{"d1","d2"}, 那么我想要得到的结果就是这么一个字符串:
b1c1d1,b1c1d2,b1c2d1,b1c2d2,b2c1d1,b2c1d2,b2c2d1,b2c2d2,b3c1d1,b3c1d2,b3c2d1,b3c2d2
请注意对象a,b,c,d的长度都是动态的,不固定的,这段代码怎么写?
谢谢
...全文
209 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
636f6c696e 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 waitforyoueveryday 的回复:]
4楼,不可以这样写,因为a这个长度不固定
[/Quote]

foreach和定不定长度没什么关系吧
ly_lsz 2011-01-11
  • 打赏
  • 举报
回复
哦,说错了,是将12楼的改一下,嘻嘻。
ly_lsz 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 waitforyoueveryday 的回复:]
不要使用linq,我只使用.net framework 2.0
[/Quote]
你用的是.net framework 2.0,只需要将11楼的改一下不就可以了么?
我感觉递归不错呀。

public static ArrayList solve(ArrayList a, int i)
{
if (a.Count == 0 || i > a.Count - 1)
{
throw new Exception();
}

if (i == a.Count - 1)
{
return a[a.Count - 1] as ArrayList;
}

ArrayList result = new ArrayList();
ArrayList combos = solve(a, i + 1);
foreach (string item in a[i] as ArrayList)
{
foreach (string c in combos)
{
string newCombo = item.ToString() + c.ToString();
result.Add(newCombo);
}
}

return result;
}

private void button2_Click(object sender, EventArgs e)
{
ArrayList b = new ArrayList();
b.Add("b1");
b.Add("b2");
b.Add("b3");
ArrayList c = new ArrayList();
c.Add("c1");
c.Add("c2");
ArrayList d = new ArrayList();
d.Add("d1");
d.Add("d2");

ArrayList a = new ArrayList();
a.Add(b);
a.Add(c);
a.Add(d);

ArrayList cc = solve(a, 0);
foreach (string item in cc)
{
Console.Write(item);
Console.WriteLine();
}
}

phil999 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 waitforyoueveryday 的回复:]

递归的缺点是效率不高,有没有不递归的?
[/Quote]

效率和递归有什么关系?
waitforyoueveryday 2011-01-10
  • 打赏
  • 举报
回复
递归的缺点是效率不高,有没有不递归的?
waitforyoueveryday 2011-01-10
  • 打赏
  • 举报
回复
不要使用linq,我只使用.net framework 2.0
phil999 2011-01-10
  • 打赏
  • 举报
回复
递归的
    class Program
{
public static void Main()
{

ArrayList b = new ArrayList();
b.Add("b1");
b.Add("b2");
b.Add("b3");
ArrayList c = new ArrayList();
c.Add("c1");
c.Add("c2");
ArrayList d = new ArrayList();
d.Add("d1");
d.Add("d2");

ArrayList a = new ArrayList();
a.Add(b);
a.Add(c);
a.Add(d);

ArrayList e = solve(a, 0);
foreach (var item in e)
{
Console.Write(item);
Console.WriteLine();
}


Console.ReadKey();
}


public static ArrayList solve(ArrayList a, int i)
{
if (a.Count == 0 || i > a.Count - 1)
{
throw new Exception();
}

if (i == a.Count - 1)
{
return a[a.Count - 1] as ArrayList;
}

ArrayList result = new ArrayList();
ArrayList combos = solve(a, i + 1);
foreach (var item in a[i] as ArrayList)
{
foreach (var c in combos)
{
string newCombo = item.ToString() + c.ToString();
result.Add(newCombo);
}
}

return result;
}

}
q107770540 2011-01-10
  • 打赏
  • 举报
回复

void Main()
{
var list=new ArrayList{
new ArrayList{"b1","b2","b3"},
new ArrayList{"c1","c2","c3"},
new ArrayList{"d1","d2"}
};


var query= from ArrayList l in list
from string l0 in l
from ArrayList l2 in list.ToArray().Where(m=>!m.Equals(l))
from string l22 in l2
from ArrayList l3 in list.ToArray().Where(m=>!m.Equals(l)&&!m.Equals(l2))
from string l33 in l3
select l0+l22+l33;


query.ToList().ForEach(q=>Console.WriteLine(q));

}

/*
b1c1d1
b1c1d2
b1c2d1
b1c2d2
b1c3d1
b1c3d2
b1d1c1
b1d1c2
b1d1c3
b1d2c1
b1d2c2
b1d2c3
b2c1d1
b2c1d2
b2c2d1
b2c2d2
b2c3d1
b2c3d2
b2d1c1
b2d1c2
b2d1c3
b2d2c1
b2d2c2
b2d2c3
b3c1d1
b3c1d2
b3c2d1
b3c2d2
b3c3d1
b3c3d2
b3d1c1
b3d1c2
b3d1c3
b3d2c1
b3d2c2
b3d2c3
c1b1d1
c1b1d2
c1b2d1
c1b2d2
c1b3d1
c1b3d2
c1d1b1
c1d1b2
c1d1b3
c1d2b1
c1d2b2
c1d2b3
c2b1d1
c2b1d2
c2b2d1
c2b2d2
c2b3d1
c2b3d2
c2d1b1
c2d1b2
c2d1b3
c2d2b1
c2d2b2
c2d2b3
c3b1d1
c3b1d2
c3b2d1
c3b2d2
c3b3d1
c3b3d2
c3d1b1
c3d1b2
c3d1b3
c3d2b1
c3d2b2
c3d2b3
d1b1c1
d1b1c2
d1b1c3
d1b2c1
d1b2c2
d1b2c3
d1b3c1
d1b3c2
d1b3c3
d1c1b1
d1c1b2
d1c1b3
d1c2b1
d1c2b2
d1c2b3
d1c3b1
d1c3b2
d1c3b3
d2b1c1
d2b1c2
d2b1c3
d2b2c1
d2b2c2
d2b2c3
d2b3c1
d2b3c2
d2b3c3
d2c1b1
d2c1b2
d2c1b3
d2c2b1
d2c2b2
d2c2b3
d2c3b1
d2c3b2
d2c3b3

*/

爱上鸟儿 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 phil999 的回复:]
引用 2 楼 bdmh 的回复:

三层循环ArrayList就可以了


三层循环不可以,因为他的数量不定,这个可以递归
[/Quote]


foreach应该可以吧
wuyq11 2011-01-10
  • 打赏
  • 举报
回复
List<string> arr1=new List<strin>(){"a1","a2"};
wuyq11 2011-01-10
  • 打赏
  • 举报
回复
var result=(from q in arr1
from q2 in arr2
from q3 in arr3
select new {a=q1q2+q3}).ToList();
foreach(var s in result)
{

}
q107770540 2011-01-10
  • 打赏
  • 举报
回复
提供个思路参考:

void Main()
{
var list=new ArrayList{
new ArrayList{"b1","b2","b3"}
};
var list2=new ArrayList{ new ArrayList{"c1","c2","c3"}};
var list3=new ArrayList{ new ArrayList{"d1","d2"}};

var query= from ArrayList l in list
from string l0 in l
let query0=from ArrayList l1 in list2
from string l11 in l1
from ArrayList l2 in list3
from string l22 in l2
select l11+l22
from q in query0
select l0+q;

query.ToList().ForEach(q=>Console.WriteLine(q));

}

/*
b1c1d1
b1c1d2
b1c2d1
b1c2d2
b1c3d1
b1c3d2
b2c1d1
b2c1d2
b2c2d1
b2c2d2
b2c3d1
b2c3d2
b3c1d1
b3c1d2
b3c2d1
b3c2d2
b3c3d1
b3c3d2

*/


waitforyoueveryday 2011-01-10
  • 打赏
  • 举报
回复
3楼,我也知道递归,就是不知道怎么递归法?
waitforyoueveryday 2011-01-10
  • 打赏
  • 举报
回复
4楼,不可以这样写,因为a这个长度不固定
bdmh 2011-01-10
  • 打赏
  • 举报
回复

System.Collections.ArrayList arr = new System.Collections.ArrayList(3);
System.Collections.ArrayList a = new System.Collections.ArrayList();
System.Collections.ArrayList b = new System.Collections.ArrayList();
System.Collections.ArrayList c = new System.Collections.ArrayList();
a.Add("a1");
a.Add("a2");
a.Add("a3");
b.Add("b1");
b.Add("b2");
c.Add("c1");
c.Add("c2");
arr.Add(a);
arr.Add(b);
arr.Add(c);
foreach (string oa in a)
{
foreach (string ob in b)
{
foreach (string oc in c)
{
listBox1.Items.Add(oa+ob+oc);
}
}
}
phil999 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bdmh 的回复:]

三层循环ArrayList就可以了
[/Quote]

三层循环不可以,因为他的数量不定,这个可以递归
bdmh 2011-01-10
  • 打赏
  • 举报
回复
三层循环ArrayList就可以了

110,555

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧