我需要创建一个数字组合列表.数字很小所以我可以使用byte而不是int.但是,它需要许多嵌套循环才能获得所有可能的组合.我想知道是否有更有效的方式来做我想要的事情.到目前为止的代码是:
var data = new List<byte[]>();
for (byte a = 0; a < 2; a++)
for (byte b = 0; b < 3; b++)
for (byte c = 0; c < 4; c++)
for (byte d = 0; d < 3; d++)
for (byte e = 0; e < 4; e++)
for (byte f = 0; f < 3; f++)
for (byte g = 0; g < 3; g++)
for (byte h = 0; h < …Run Code Online (Sandbox Code Playgroud) 我想生成一个集合(集合)的所有排列,如下所示:
Collection: 1, 2, 3
Permutations: {1, 2, 3}
{1, 3, 2}
{2, 1, 3}
{2, 3, 1}
{3, 1, 2}
{3, 2, 1}
Run Code Online (Sandbox Code Playgroud)
一般而言,这不是"如何"的问题,而是关于如何最有效的问题.此外,我不想生成所有排列并返回它们,但一次只生成一个排列,并且只在必要时继续(很像迭代器 - 我也尝试过,但结果却少了有效).
我已经测试了很多算法和方法,并提出了这个代码,这是我尝试过的最有效的代码:
public static bool NextPermutation<T>(T[] elements) where T : IComparable<T>
{
// More efficient to have a variable instead of accessing a property
var count = elements.Length;
// Indicates whether this is the last lexicographic permutation
var done = true;
// Go through the array from last to first
for (var i = …Run Code Online (Sandbox Code Playgroud) 是否有可能创建一些Linq,生成一个包含一系列数字的所有可能组合的List?
如果输入"21",它将生成一个包含以下元素的列表:
list[0] = "21"
list[1] = "22"
list[2] = "11"
list[3] = "12"
Run Code Online (Sandbox Code Playgroud)
(不按顺序)
我知道你可以使用范围来做以下事情:
List<char> letterRange = Enumerable.Range('a', 'z' - 'a' + 1).Select(i => (Char)i).ToList(); //97 - 122 + 1 = 26 letters/iterations
Run Code Online (Sandbox Code Playgroud)
从az生成字母表.但我似乎无法转移这些知识来制作组合发生器
我已经能够用以下代码弄清楚它,但它似乎太笨重了,我相信它可以用几行完成.它确实感觉我做的是一个糟糕的解决方案.
想象一下,GetAllCombinations("4321")如果有帮助,我已经打过电话
public static String[] GetAllCombinations(String s)
{
var combinations = new string[PossibleCombinations(s.Length)];
int n = PossibleCombinations(s.Length - 1);
for (int i = 0; i < s.Length; i++)
{
String sub;
String[] subs;
if (i == 0)
{
sub = s.Substring(1); //Get …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一种算法来从一组数字中选择n个值的所有组合.
例如,给定集合: 1, 2, 3, 7, 8, 9
该组中2个值的所有组合为:
(1,2),(1,3),(1,7),(1,8),(1,9),(2,3),(2,7),(2,8),(2) ,9),(3,7),(3,8),(3,9),(7,8),(7,9),(8,9)
3是:
(1,2,3),(1,2,7),(1,2,8),(1,2,9),(1,3,7),(1,3,8),(1) ,3,9),(1,7,8),(1,7,9),(1,8,9),(2,3,7),(2,3,8),(2,3) ,9),(2,7,8),(2,7,9),(2,8,9),(3,7,8),(3,7,9),(3,8,9) ),(7,8,9)
等等!
我目前正在使用方法来产生2,3和4值组合的返回集,但在我看来,这可以在LINQ查询中推广.
谢谢你的帮助!
我有一个带有可能值的参数列表:
// Definition of a parameter
public class prmMatrix
{
public string Name { get; set; }
public List<string> PossibleValues { get; set; }
public prmMatrix(string name, List<string> values)
{
Name = name;
PossibleValues = values;
}
}
//[...]
// List of params
List<prmMatrix> lstParams = new List<prmMatrix>();
lstParams.Add(new prmMatrix("Option A", new List<string>() { "Yes", "No" }));
lstParams.Add(new prmMatrix("Option B", new List<string>() { "Positive", "Negative" }));
Run Code Online (Sandbox Code Playgroud)
我希望所有参数组合都可能,例如:
[Option A:Yes][Option B:Positive]
[Option A:Yes][Option B:Negative]
[Option A:No][Option B:Positive]
[Option A:No][Option B:Negative]
Run Code Online (Sandbox Code Playgroud)
C#中最好的方法是什么?
c# ×5
combinations ×3
algorithm ×2
linq ×2
permutation ×2
logic ×1
optimization ×1
performance ×1
set ×1