代码可以参考: 把所有数组都添加到一个动态数组中, 然后在这一个动态数组中, 随机出3个数字. //实例化随机函数 Random rand = new Random(); private void button1_Click(object sender, EventArgs e) { int[] hearts = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; int[] spades = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; int[] diamonds = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; int[] clubs = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; //创建动态数组 ArrayList list = new ArrayList(); //循环把4个int[]数组添加到动态数组list中 foreach (int i in hearts) { list.Add(i); } foreach (int i in spades) { list.Add(i); } foreach (int i in diamonds) { list.Add(i); } foreach (int i in clubs) { list.Add(i); } //按照list的元素数量, 循环随机出三个数: list[随机数] for (int i = 0; i < 3; i++) { MessageBox.Show(list[rand.Next(0, list.Count - 1)].ToString()); } }
var query = from x in list1 from y in list2.Concat(list3).Concat(list4).Concat(list5) select x + "&" + y; foreach (string item in query) Console.WriteLine(item);
按条件检索数组中的匹配元素 private string[] G_str_array;//定义字符串数组字段 //显示数组字段 private void Frm_Main_Load(object sender, EventArgs e) { G_str_array = new string[] {//为字符串数组字段赋值 "张小三一班","王小五二班","李中立三班","席桂璐四班"}; for (int i = 0; i < G_str_array.Length; i++)//循环输出字符串 { lab_Message.Text += G_str_array[i] + "\n"; } } //匹配字符串 private void txt_find_TextChanged(object sender, EventArgs e) { if (txt_find.Text != string.Empty)//判断查找字符串是否为空 { string[] P_str_temp = Array.FindAll//使用FindAll方法查找相应字符串 (G_str_array, (s) => s.Contains(txt_find.Text)); if (P_str_temp.Length > 0)//判断是否查找到相应字符串 { txt_display.Clear();//清空控件中的字符串 foreach (string s in P_str_temp)//向控件中添加字符串 { txt_display.Text += s + Environment.NewLine; } } else { txt_display.Clear();//清空控件中的字符串 txt_display.Text = "没有找到记录";//提示没有找到记录 } } else { txt_display.Clear();//清空控件中的字符串 } }
百度百科里的笛卡尔乘积,竟然有C#源码程序使用说明(1)将每个维度的集合的元素视为List<string>,多个集合构成List<List<string>> dimvalue作为输入 (2)将多维笛卡尔乘积的结果放到List<string> result之中作为输出 (3)int layer, string curstring只是两个中间过程的参数携带变量 (4)程序采用递归调用,起始调用示例如下: List<string> result = new List<string>(); Descartes.run(dimvalue, result, 0, ""); 即可获得多维笛卡尔乘积的结果。PS:代码没测试过,仅供参考using System; using System.Collections; using System.Collections.Generic; using System.Text; using System.Linq; public class Descartes { public static void run(List<List<string>> dimvalue, List<string> result, int layer, string curstring) { if (layer < dimvalue.Count - 1) { if (dimvalue[layer].Count == 0) run(dimvalue, result, layer + 1, curstring); else { for (int i = 0; i < dimvalue[layer].Count; i++) { StringBuilder s1 = new StringBuilder(); s1.Append(curstring); s1.Append(dimvalue[layer][i]); run(dimvalue, result, layer + 1, s1.ToString()); } } } else if (layer == dimvalue.Count - 1) { if (dimvalue[layer].Count == 0) result.Add(curstring); else { for (int i = 0; i < dimvalue[layer].Count; i++) { result.Add(curstring + dimvalue[layer][i]); } } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApplication1 { class Program { static void Main(string[] args) { List<List<string>> lists = new List<List<string>>() { new List<string>() { "张三", "李四" }, new List<string>() { "你", "我" }, new List<string>() { "人" }, new List<string>() { "食物", "材料" }, new List<string>() { "x", "y" }, new List<string>() { "d", "s" } }; List<IEnumerable<List<string>>> query = SelectNFromM(lists, 3); foreach (IEnumerable<List<string>> item in query) { IEnumerable<IEnumerable<string>> query1 = CartesianProduct<string>(item.ToList()); foreach (var item1 in query1) { Console.WriteLine(string.Join("&", item1)); } } } static List<IEnumerable<T>> SelectNFromM<T>(List<T> data, int n) { int[] are = Enumerable.Range(0, data.Count).ToArray(); var result = are.Select(x => new int[] { x }); for (int i = 0; i < n - 1; i++) { result = result.SelectMany(x => are.Where(y => y.CompareTo(x.First()) < 0).Select(y => new int[] { y }.Concat(x).ToArray())); } return result.Select(x => x.Select(y => data[y])).ToList(); } static IEnumerable<IEnumerable<T>> CartesianProduct<T>(List<List<T>> source) { List<T[]> result = source[0].Select(x => new T[] { x }).ToList(); for (int i = 1; i < source.Count; i++) { if (i == source.Count) break; result = result.SelectMany(x => source[i].Select(y => x.Concat(new T[] { y }).ToArray())).ToList(); } return result; } } }
把所有数组都添加到一个动态数组中, 然后在这一个动态数组中, 随机出3个数字.
//实例化随机函数
Random rand = new Random();
private void button1_Click(object sender, EventArgs e)
{
int[] hearts = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
int[] spades = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
int[] diamonds = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
int[] clubs = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
//创建动态数组
ArrayList list = new ArrayList();
//循环把4个int[]数组添加到动态数组list中
foreach (int i in hearts)
{
list.Add(i);
}
foreach (int i in spades)
{
list.Add(i);
}
foreach (int i in diamonds)
{
list.Add(i);
}
foreach (int i in clubs)
{
list.Add(i);
}
//按照list的元素数量, 循环随机出三个数: list[随机数]
for (int i = 0; i < 3; i++)
{
MessageBox.Show(list[rand.Next(0, list.Count - 1)].ToString());
}
}
from y in list2.Concat(list3).Concat(list4).Concat(list5)
select x + "&" + y;
foreach (string item in query) Console.WriteLine(item);
private string[] G_str_array;//定义字符串数组字段
//显示数组字段
private void Frm_Main_Load(object sender, EventArgs e)
{
G_str_array = new string[] {//为字符串数组字段赋值
"张小三一班","王小五二班","李中立三班","席桂璐四班"};
for (int i = 0; i < G_str_array.Length; i++)//循环输出字符串
{
lab_Message.Text += G_str_array[i] + "\n";
}
}
//匹配字符串
private void txt_find_TextChanged(object sender, EventArgs e)
{
if (txt_find.Text != string.Empty)//判断查找字符串是否为空
{
string[] P_str_temp = Array.FindAll//使用FindAll方法查找相应字符串
(G_str_array, (s) => s.Contains(txt_find.Text));
if (P_str_temp.Length > 0)//判断是否查找到相应字符串
{
txt_display.Clear();//清空控件中的字符串
foreach (string s in P_str_temp)//向控件中添加字符串
{
txt_display.Text += s + Environment.NewLine;
}
}
else
{
txt_display.Clear();//清空控件中的字符串
txt_display.Text = "没有找到记录";//提示没有找到记录
}
}
else
{
txt_display.Clear();//清空控件中的字符串
}
}
如果是不定个数,可以做个递归,把个数当做参数传进去
如果我要匹配 list1 list2 list3 list4 list5 然后从中找所有三个三个匹配的 怎么做呢? 上面的那个方法 貌似对两组很给力 做一个list循环,但是如果做三个匹配,该怎么做呢?
如果我要匹配 list1 list2 list3 list4 list5 然后从中找所有三个三个匹配的 怎么做呢? 上面的那个方法 貌似对两组很给力 做一个list循环,但是如果做三个匹配,该怎么做呢?贴出你的测试用例。否则写了半天你又说不是那么回事。
这个方法只能查询到第一个数组跟第二个数组的排列 list1 & list2怎么可能,当然包括list3 ist4 list5
如果我要匹配 list1 list2 list3 list4 list5 然后从中找所有三个三个匹配的 怎么做呢? 上面的那个方法 貌似对两组很给力 做一个list循环,但是如果做三个匹配,该怎么做呢?贴出你的测试用例。否则写了半天你又说不是那么回事。就是竞彩足球,竞彩篮球的计算方法,拆分的场次比赛方法,有什么路子
http://bbs.csdn.net/topics/390550326至于彩票,我不感兴趣。这只是穷人梦想发财的三大陷阱(另外两个是股票和传销)之一。
不是啊,你理解错误了,我不是做彩票发财的,购买彩票要计算注数,买10场比赛,选择过关方式 N串N,然后计算出一共多少注,多少场,并不是说做BUG或者那种投机者的白日梦啊!
不是啊,你理解错误了,我不是做彩票发财的,购买彩票要计算注数,买10场比赛,选择过关方式 N串N,然后计算出一共多少注,多少场,并不是说做BUG或者那种投机者的白日梦啊!不知道你的M"串"N的串是什么意思。我的意思是,你得负责把你们彩票里面的术语翻译成我们能理解的意思。
如果是M选N,参考我之前贴出的链接里的代码。
不是啊,你理解错误了,我不是做彩票发财的,购买彩票要计算注数,买10场比赛,选择过关方式 N串N,然后计算出一共多少注,多少场,并不是说做BUG或者那种投机者的白日梦啊!不知道你的M"串"N的串是什么意思。我的意思是,你得负责把你们彩票里面的术语翻译成我们能理解的意思。
如果是M选N,参考我之前贴出的链接里的代码。
OK 好的,我重新细说一次,现在呢 用户选择出一些集合 list 1 list2 list3 list4 list5 当然 可能不止这么写list 所以我把这么list的count数称为 N
然后用户又选择了 要从N中选择4个串在一起 这个意思就是比如说list1 {张三,李四}; list2{你,我};list3{人};list4{食物,材料};list5{x,y} .....listN{d,s};
那么所谓的串就是
张三&你&人&食物 张三&我&人&材料 张三&你&人&材料 张三&我&人&食物
李四&你&人&食物。
张三&你&人&x
李四 &我&人&x就是要找这么些东西,找出匹配结果! 这就是所谓的串。不知道大神能否指一条明路!
不是啊,你理解错误了,我不是做彩票发财的,购买彩票要计算注数,买10场比赛,选择过关方式 N串N,然后计算出一共多少注,多少场,并不是说做BUG或者那种投机者的白日梦啊!不知道你的M"串"N的串是什么意思。我的意思是,你得负责把你们彩票里面的术语翻译成我们能理解的意思。
如果是M选N,参考我之前贴出的链接里的代码。
当然了,可能不是选择四个,有可能是五个 有可能是6个,这个数字不固定,我可以定义为 M 意思就是 N串MN是集合的个数 M是串的场次数,这个可能相对复杂点!
不是啊,你理解错误了,我不是做彩票发财的,购买彩票要计算注数,买10场比赛,选择过关方式 N串N,然后计算出一共多少注,多少场,并不是说做BUG或者那种投机者的白日梦啊!不知道你的M"串"N的串是什么意思。我的意思是,你得负责把你们彩票里面的术语翻译成我们能理解的意思。
如果是M选N,参考我之前贴出的链接里的代码。
当然了,可能不是选择四个,有可能是五个 有可能是6个,这个数字不固定,我可以定义为 M 意思就是 N串MN是集合的个数 M是串的场次数,这个可能相对复杂点!
只要你能把你要做什么说清楚,就不复杂。问题就是你自己说不清楚。而且你也不能用数学方法或者测试用例来精确描述你的问题。
不是啊,你理解错误了,我不是做彩票发财的,购买彩票要计算注数,买10场比赛,选择过关方式 N串N,然后计算出一共多少注,多少场,并不是说做BUG或者那种投机者的白日梦啊!不知道你的M"串"N的串是什么意思。我的意思是,你得负责把你们彩票里面的术语翻译成我们能理解的意思。
如果是M选N,参考我之前贴出的链接里的代码。
当然了,可能不是选择四个,有可能是五个 有可能是6个,这个数字不固定,我可以定义为 M 意思就是 N串MN是集合的个数 M是串的场次数,这个可能相对复杂点!
只要你能把你要做什么说清楚,就不复杂。问题就是你自己说不清楚。而且你也不能用数学方法或者测试用例来精确描述你的问题。
其实我也不知道咋描述,我之前一直不玩彩票的,最近在这个公司上班,现在要解析这些东西,我也只能求助大神们了!
(2)将多维笛卡尔乘积的结果放到List<string> result之中作为输出
(3)int layer, string curstring只是两个中间过程的参数携带变量
(4)程序采用递归调用,起始调用示例如下:
List<string> result = new List<string>();
Descartes.run(dimvalue, result, 0, "");
即可获得多维笛卡尔乘积的结果。PS:代码没测试过,仅供参考using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Linq;
public class Descartes
{
public static void run(List<List<string>> dimvalue, List<string> result, int layer, string curstring)
{
if (layer < dimvalue.Count - 1)
{
if (dimvalue[layer].Count == 0)
run(dimvalue, result, layer + 1, curstring);
else
{
for (int i = 0; i < dimvalue[layer].Count; i++)
{
StringBuilder s1 = new StringBuilder();
s1.Append(curstring);
s1.Append(dimvalue[layer][i]);
run(dimvalue, result, layer + 1, s1.ToString());
}
}
}
else if (layer == dimvalue.Count - 1)
{
if (dimvalue[layer].Count == 0) result.Add(curstring);
else
{
for (int i = 0; i < dimvalue[layer].Count; i++)
{
result.Add(curstring + dimvalue[layer][i]);
}
}
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
List<List<string>> lists = new List<List<string>>()
{
new List<string>() { "张三", "李四" },
new List<string>() { "你", "我" },
new List<string>() { "人" },
new List<string>() { "食物", "材料" },
new List<string>() { "x", "y" },
new List<string>() { "d", "s" }
};
List<IEnumerable<List<string>>> query = SelectNFromM(lists, 3);
foreach (IEnumerable<List<string>> item in query)
{
IEnumerable<IEnumerable<string>> query1 = CartesianProduct<string>(item.ToList());
foreach (var item1 in query1)
{
Console.WriteLine(string.Join("&", item1));
}
}
} static List<IEnumerable<T>> SelectNFromM<T>(List<T> data, int n)
{
int[] are = Enumerable.Range(0, data.Count).ToArray();
var result = are.Select(x => new int[] { x });
for (int i = 0; i < n - 1; i++)
{
result = result.SelectMany(x => are.Where(y => y.CompareTo(x.First()) < 0).Select(y => new int[] { y }.Concat(x).ToArray()));
}
return result.Select(x => x.Select(y => data[y])).ToList();
} static IEnumerable<IEnumerable<T>> CartesianProduct<T>(List<List<T>> source)
{
List<T[]> result = source[0].Select(x => new T[] { x }).ToList();
for (int i = 1; i < source.Count; i++)
{
if (i == source.Count) break;
result = result.SelectMany(x => source[i].Select(y => x.Concat(new T[] { y }).ToArray())).ToList();
}
return result;
}
}
}
张三&我&人
李四&你&人
李四&我&人
张三&你&食物
张三&你&材料
张三&我&食物
张三&我&材料
李四&你&食物
李四&你&材料
李四&我&食物
李四&我&材料
张三&人&食物
张三&人&材料
李四&人&食物
李四&人&材料
你&人&食物
你&人&材料
我&人&食物
我&人&材料
张三&你&x
张三&你&y
张三&我&x
张三&我&y
李四&你&x
李四&你&y
李四&我&x
李四&我&y
张三&人&x
张三&人&y
李四&人&x
李四&人&y
你&人&x
你&人&y
我&人&x
我&人&y
张三&食物&x
张三&食物&y
张三&材料&x
张三&材料&y
李四&食物&x
李四&食物&y
李四&材料&x
李四&材料&y
你&食物&x
你&食物&y
你&材料&x
你&材料&y
我&食物&x
我&食物&y
我&材料&x
我&材料&y
人&食物&x
人&食物&y
人&材料&x
人&材料&y
张三&你&d
张三&你&s
张三&我&d
张三&我&s
李四&你&d
李四&你&s
李四&我&d
李四&我&s
张三&人&d
张三&人&s
李四&人&d
李四&人&s
你&人&d
你&人&s
我&人&d
我&人&s
张三&食物&d
张三&食物&s
张三&材料&d
张三&材料&s
李四&食物&d
李四&食物&s
李四&材料&d
李四&材料&s
你&食物&d
你&食物&s
你&材料&d
你&材料&s
我&食物&d
我&食物&s
我&材料&d
我&材料&s
人&食物&d
人&食物&s
人&材料&d
人&材料&s
张三&x&d
张三&x&s
张三&y&d
张三&y&s
李四&x&d
李四&x&s
李四&y&d
李四&y&s
你&x&d
你&x&s
你&y&d
你&y&s
我&x&d
我&x&s
我&y&d
我&y&s
人&x&d
人&x&s
人&y&d
人&y&s
食物&x&d
食物&x&s
食物&y&d
食物&y&s
材料&x&d
材料&x&s
材料&y&d
材料&y&s
Press any key to continue . . .
大神,你说的第一步过滤是怎么过滤?