有効な言葉は別の回答で述べたとおりですが、現在の状態では不可能ですが、コードをかなり明確にしました。
最後に、コードは 3 つの部分に分かれています。Permutable<T>
でConsoleHelper
ありConsoleApplication1.Program
、ユーティリティPermutation
クラスを備えています。
Permutable<T> (Permutable.cs)
using System.Collections.Generic;
using System.Collections;
using System;
public partial class Permutable<T>: IEnumerable {
public static explicit operator Permutable<T>(T[] array) {
return new Permutable<T>(array);
}
static IEnumerable Permute<TElement>(IList<TElement> list, int depth, int count) {
if(count==depth)
yield return list;
else {
for(var i=depth; i<=count; ++i) {
Swap(list, depth, i);
foreach(var sequence in Permutable<T>.Permute(list, 1+depth, count))
yield return sequence;
Swap(list, depth, i);
}
}
}
static void Swap<TElement>(IList<TElement> list, int depth, int index) {
var local=list[depth];
list[depth]=list[index];
list[index]=local;
}
IEnumerator IEnumerable.GetEnumerator() {
return this.GetEnumerator();
}
public IEnumerator<IList<T>> GetEnumerator() {
var list=this.m_List;
if(list.Count>0)
foreach(IList<T> sequence in Permutable<T>.Permute(list, 0, list.Count-1))
yield return sequence;
}
protected Permutable(IList<T> list) {
this.m_List=list;
}
IList<T> m_List;
}
ConsoleHelper (ConsoleHelper.cs)
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Drawing;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public static partial class ConsoleHelper {
[StructLayout(LayoutKind.Sequential)]
public struct RECT {
public static explicit operator Rectangle(RECT rect) {
return new Rectangle {
X=rect.Left,
Y=rect.Top,
Width=rect.Right-rect.Left,
Height=rect.Bottom-rect.Top
};
}
public int Left;
public int Top;
public int Right;
public int Bottom;
}
[DllImport("user32.dll", SetLastError=true)]
static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int Width, int Height, bool repaint);
[DllImport("user32.dll", SetLastError=true)]
static extern bool GetWindowRect(IntPtr hWnd, out RECT rect);
[DllImport("kernel32.dll", SetLastError=true)]
static extern IntPtr GetConsoleWindow();
public static void CenterScreen() {
RECT rect;
var hWnn=ConsoleHelper.GetConsoleWindow();
var workingArea=Screen.GetWorkingArea(Point.Empty);
ConsoleHelper.GetWindowRect(hWnn, out rect);
var rectangle=(Rectangle)rect;
rectangle=
new Rectangle {
X=(workingArea.Width-rectangle.Width)/2,
Y=(workingArea.Height-rectangle.Height)/2,
Width=rectangle.Width,
Height=rectangle.Height
};
ConsoleHelper.MoveWindow(
hWnn,
rectangle.Left, rectangle.Top, rectangle.Width, rectangle.Height,
true
);
}
}
ConsoleApplication1.Program & Permutation (Program.cs)
using System.Collections;
using System.IO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public partial class Permutation {
public static Permutation FromFile(String path) {
return new Permutation(path);
}
public static String GetSortedAlphabet(String text) {
var array=text.ToArray();
Array.Sort(array);
return new String(array);
}
public Dictionary<String, String> Dictionary {
private set;
get;
}
public FileInfo SourceFile {
private set;
get;
}
public Permutation(String path) {
this.Dictionary=(
from line in File.ReadAllLines(path)
where false==String.IsNullOrEmpty(line)
group line by Permutation.GetSortedAlphabet(line) into g
select
new {
Value=String.Join(", ", g.Distinct().ToArray()),
Key=g.Key
}
).ToDictionary(x => x.Key, x => x.Value);
this.SourceFile=new FileInfo(path);
}
}
namespace ConsoleApplication1 {
partial class Program {
static void ProcessLine(IList<char> input) {
Console.WriteLine();
if(input.Count>0) {
var inputArray=input.ToArray();
var key=Permutation.GetSortedAlphabet(new String(inputArray));
var dict=Program.Permutation.Dictionary;
var hasKey=dict.ContainsKey(key);
var source=Permutation.SourceFile;
Console.WriteLine("Possible permutations are: ");
foreach(var sequence in (Permutable<char>)inputArray)
Console.WriteLine("{0}", new String(sequence.ToArray()));
Console.WriteLine("Acceptable in file '{0}' are: ", source.FullName);
Console.WriteLine("{0}", hasKey?dict[key]:"<none>");
Console.WriteLine();
input.Clear();
}
Console.Write(Prompt);
}
static void ProcessChar(IList<char> input, char keyChar) {
Console.Write(keyChar);
input.Add(keyChar);
}
static void ProcessExit(IList<char> input, char keyChar) {
Console.WriteLine();
Console.Write("Are you sure to exit? (Press Esc again to exit)");
input.Add(keyChar);
}
static bool ProcessLast(IList<char> input, char keyChar) {
var last=input.Count-1;
if(0>last||input[last]!=(char)ConsoleKey.Escape)
return false;
input.Clear();
return true;
}
public static Permutation Permutation {
private set;
get;
}
public static String Prompt {
private set;
get;
}
}
partial class Program {
static void Main(String[] args) {
Console.BufferHeight=short.MaxValue-1;
Console.SetWindowSize(120, 40);
ConsoleHelper.CenterScreen();
var input=new List<char>(char.MaxValue);
Program.Permutation=Permutation.FromFile(@"c:\dictionary.txt");
Program.Prompt="User>\x20";
Program.ProcessLine(input);
for(; ; ) {
var keyInfo=Console.ReadKey(true);
var keyChar=keyInfo.KeyChar;
var keyCode=keyInfo.Key;
if(ConsoleKey.Escape==keyCode) {
if(Program.ProcessLast(input, keyChar))
break;
Program.ProcessExit(input, keyChar);
continue;
}
if(ConsoleKey.Enter==keyCode) {
Program.ProcessLine(input);
continue;
}
if(default(ConsoleModifiers)!=keyInfo.Modifiers)
continue;
if(0x1f>keyChar||keyChar>0x7f)
continue;
if(Program.ProcessLast(input, keyChar))
Console.WriteLine();
Program.ProcessChar(input, keyChar);
}
}
}
}
このConsoleHelper
クラスは、サイズ変更されたコンソール ウィンドウの一部にのみ使用され、プログラムをより快適にテストできます。クラスは、元のPermutable
クラスから完全に再設計したものです。それは現在IEnumerable
、順列とジェネリック クラスに付属しています。
このPermutation
クラスは、ユーティリティ クラスのようなもので、それ自体がFromFile
元の としてメソッドを提供し、プロパティとしてRead
保存しDictionary<String, String>
ます。元のメソッドは、より意味的Alphabet
に名前が変更されています。GetSortedAlphabet
このProgram
クラスには 4 つの主な静的ProcessXXX
メソッドがあります。
- ProcessChar:からまで
char
の範囲のプロセス0x20
0x7f
- ProcessLine:
Enter
プレスのプロセス
- ProcessExit:
Excape
押されたプロセス
- ProcessLast:
ProcessLine
およびの追加処理ProcessExit
はい、同じ長さの名前にするつもりでした。さらに、Program
クラスには 2 つの静的プロパティがあります。Permutation
class のインスタンスを格納するためのPermutation
ものPrompt
で、ユーザーにプロンプトを表示するための文字列です。
入力が で定義されていない場合"c:\dictionary.txt"
、 のプロンプトが表示され"Acceptable in file .."
ます"<none>"
。
終了コマンドは、Escape キーを 2 回押すことです。
終了してもよろしいですか?(終了するにはもう一度 Esc キーを押します)
またはその他のキーを押すEnter
と、初期状態に戻ります。
それで全部です。ここで、遭遇した最終的な問題を発見する時が来ました。このプログラムでテストした後、質問や問題をより明確に説明できます。
幸運を!