我有一个Type数组,我想为这些类型生成所有可能的组合。即:(仅假设int,bool和string)
诠释/
布尔/
串/
整数,布尔值/
整数,字符串/
整数,布尔值,字符串/
整数,字符串,布尔值/
等等
我在这里看到了埃里克·利珀特的答案:Generating all Possible Combinations
并且正在使用他的方法,但是我很难修改它以使用Type数组而不是string / int。
使我绊倒的部分是“ Enumerable.Range()”和最后一部分中的功能lamba。
这是我尝试过但未编译的内容,因为x是一个int而不是类型。
return from cpLine in CartesianProduct(
from type in types select Enumerable.Range(1, types.Length))
select cpLine.Zip(types, (x1, x2) => new Tuple<Type, Type>(x1, x2));
最佳答案
您可以通过以下方式使用CartesianProduct
:
var types = new List<Type>() { typeof(int), typeof(bool), typeof(string) };
var result = Enumerable.Range(1, types.Count())
.Select(x => types.AsEnumerable()).CartesianProduct().ToList();
我想您有
CartesianProduct
创建的Eric Lippert扩展方法:public static class Extensions
{
public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences)
{
IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() };
return sequences.Aggregate(
emptyProduct,
(accumulator, sequence) =>
from accseq in accumulator
from item in sequence
select accseq.Concat(new[] { item })
);
}
}
这是输出:
01: Int32, Int32, Int32
02: Int32, Int32, Boolean
03: Int32, Int32, String
04: Int32, Boolean, Int32
05: Int32, Boolean, Boolean
06: Int32, Boolean, String
07: Int32, String, Int32
08: Int32, String, Boolean
09: Int32, String, String
10: Boolean, Int32, Int32
11: Boolean, Int32, Boolean
12: Boolean, Int32, String
13: Boolean, Boolean, Int32
14: Boolean, Boolean, Boolean
15: Boolean, Boolean, String
16: Boolean, String, Int32
17: Boolean, String, Boolean
18: Boolean, String, String
19: String, Int32, Int32
20: String, Int32, Boolean
21: String, Int32, String
22: String, Boolean, Int32
23: String, Boolean, Boolean
24: String, Boolean, String
25: String, String, Int32
26: String, String, Boolean
27: String, String, String
编辑
要从
IEnumerable<T>
获得所有可能的输出以及所有可能的项目计数,可以添加以下扩展方法:public static IEnumerable<IEnumerable<T>> GetAllPossibleCombinations<T>(this IEnumerable<T> source)
{
var result = new List<IEnumerable<T>>().AsEnumerable();
for (int i = 1; i <= source.Count(); i++)
{
var intermediateResult = Enumerable.Range(1, i)
.Select(x => source.AsEnumerable()).CartesianProduct();
result = result.Union(intermediateResult);
}
return result;
}
然后以这种方式使用它:
var types = new List<Type>() { typeof(int), typeof(bool), typeof(string) };
var result = types.GetAllPossibleCombinations();
这是输出:
01: Int32
02: Boolean
03: String
04: Int32, Int32
05: Int32, Boolean
06: Int32, String
07: Boolean, Int32
08: Boolean, Boolean
09: Boolean, String
10: String, Int32
11: String, Boolean
12: String, String
13: Int32, Int32, Int32
14: Int32, Int32, Boolean
15: Int32, Int32, String
16: Int32, Boolean, Int32
17: Int32, Boolean, Boolean
18: Int32, Boolean, String
19: Int32, String, Int32
20: Int32, String, Boolean
21: Int32, String, String
22: Boolean, Int32, Int32
23: Boolean, Int32, Boolean
24: Boolean, Int32, String
25: Boolean, Boolean, Int32
26: Boolean, Boolean, Boolean
27: Boolean, Boolean, String
28: Boolean, String, Int32
29: Boolean, String, Boolean
30: Boolean, String, String
31: String, Int32, Int32
32: String, Int32, Boolean
33: String, Int32, String
34: String, Boolean, Int32
35: String, Boolean, Boolean
36: String, Boolean, String
37: String, String, Int32
38: String, String, Boolean
39: String, String, String
关于c# - 如何从数组中获取所有可能的组合?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34540804/