110,545
社区成员
发帖
与我相关
我的任务
分享
class item
{
public string name { get; set; }
public int level { get; set; }
}
List<item> all = new List<item>();
all.Add(new item { name = "Red", level = 0 });
all.Add(new item { name = "Blue", level = 0 });
all.Add(new item { name = "S", level = 1 });
all.Add(new item { name = "M", level = 1 });
all.Add(new item { name = "L", level = 1 });
all.Add(new item { name = "Man", level = 2 });
all.Add(new item { name = "Woman", level = 2 });
foreach(var _0 in all.Where(m => m.level == 0))
{
foreach(var _1 in all.Where(m => m.level == 1))
{
foreach(var _2 in all.Where(m => m.level == 2))
{
System.Console.WriteLine(_0.name + "-" + _1.name + "-" + _2.name);
}
}
}
public class Main
{
/// <summary>
/// 笛卡尔乘积的递归方法
/// </summary>
/// <param name="result">结果</param>
/// <param name="data">数据集</param>
/// <param name="level">递增维度</param>
/// <param name="path">中间值</param>
static void Recursive(List<string> result, List<List<string>> data, int level, string path)
{
if (level >= data.Count)
{
result.Add(path);
return;
}
foreach (var item in data[level])
Recursive(result, data, level + 1, path == null ? item : path + "-" + item);
}
public void Go()
{
List<List<string>> data = new List<List<string>>();
List<string> dataItem1 = new List<string>();
dataItem1.Add("Red");
dataItem1.Add("Blue");
data.Add(dataItem1);
List<string> dataItem2 = new List<string>();
dataItem2.Add("S");
dataItem2.Add("M");
dataItem2.Add("L");
data.Add(dataItem2);
List<string> dataItem3 = new List<string>();
dataItem3.Add("Man");
dataItem3.Add("Woman");
data.Add(dataItem3);
List<string> result = new List<string>();
Recursive(result, data, 0, null);
foreach (var s in result)
System.Console.WriteLine(s);
}
}//end class
class item
{
public string name { get; set; }
public int level { get; set; }
}
static void Main(string[] args)
{
List<item> all = new List<item>();
all.Add(new item { name = "Red", level = 0 });
all.Add(new item { name = "Blue", level = 0 });
all.Add(new item { name = "S", level = 1 });
all.Add(new item { name = "M", level = 1 });
all.Add(new item { name = "L", level = 1 });
all.Add(new item { name = "Man", level = 2 });
all.Add(new item { name = "Woman", level = 2 });
var r = all.GroupBy(x => x.level)
.Select(x => x.Select(y => y.name))
.Aggregate((a, b) => a.SelectMany(x => b.Select(y => x + "-" + y)))
.ToList();
}
public static List<List<T>> CartesianProduct<T>(this List<List<T>> lstSplit)
{
int count = 1;
lstSplit.ForEach(item => count *= item.Count);
//count = lstSplit.Aggregate(1, (result, next) => result * next.Count);
var lstResult = new List<List<T>>();
for (int i = 0; i < count; ++i)
{
var lstTemp = new List<T>();
int j = 1;
lstSplit.ForEach(item =>
{
j *= item.Count;
lstTemp.Add(item[(i / (count / j)) % item.Count]);
});
lstResult.Add(lstTemp);
}
return lstResult;
}
List<item> all = new List<item>();
all.Add(new item { name = "Red", level = 0 });
all.Add(new item { name = "Blue", level = 0 });
all.Add(new item { name = "S", level = 1 });
all.Add(new item { name = "M", level = 1 });
all.Add(new item { name = "L", level = 1 });
all.Add(new item { name = "Man", level = 2 });
all.Add(new item { name = "Woman", level = 2 });
var gps = all.GroupBy(i => i.level).ToList();
var result = gps[0].Select(i => i.name).ToList();
for (var j = 1; j < gps.Count; j++)
{
result = (from r in result
from t in gps[j]
select r + "-" + t.name).ToList();
}
foreach (var r in result)
{
Console.WriteLine(r);
}