public static Result Run(Window parent) { var dialog = new CombinationsPermutationsDialog { Owner = parent }; return dialog.ShowDialog() ? dialog.result : null; }
void Command_Numeric_CombinationsPermutations(CombinationsPermutationsDialog.Result result) { if (Selections.Count != 1) throw new Exception("Must have one selection."); var output = new List<List<string>>(); var nums = new int[result.UseCount]; var used = new bool[result.ItemCount]; nums[0] = -1; var onNum = 0; while (true) { ++nums[onNum]; if (nums[onNum] >= result.ItemCount) { --onNum; if (onNum < 0) break; used[nums[onNum]] = false; continue; } if ((!result.Repeat) && (used[nums[onNum]])) continue; used[nums[onNum]] = true; ++onNum; if (onNum < result.UseCount) { if (result.Type == CombinationsPermutationsDialog.CombinationsPermutationsType.Combinations) nums[onNum] = nums[onNum - 1] - 1; else nums[onNum] = -1; } else { output.Add(nums.Select(num => (num + 1).ToString()).ToList()); --onNum; used[nums[onNum]] = false; } } ReplaceSelections(string.Join("", output.Select(row => string.Join(" ", row) + Data.DefaultEnding))); var start = Selections.Single().Start; var sels = new List<Range>(); foreach (var row in output) { foreach (var str in row) { sels.Add(Range.FromIndex(start, str.Length)); start += str.Length + 1; // +1 is for space } start += Data.DefaultEnding.Length - 1; // -1 is for space added before } Selections.Replace(sels); }