2011-06-21 8 views
-1

私は2つの単語を持っているジャックC#のテキストの違い

を、私は「をConvertTo」という言葉に同時に変換の効果「ソース」からのすべての文字を表示したいです。私はすでにそれを達成するためのプログラムを作成しますが、スレッドを使用する効果を示すために、一度に1文字を処理します。それは、すべての文字を同時に処理することです。文字ごとに1つのスレッドが必要であり、手紙を処理するのと同じ関数、グローバル変数を使用します。私は自分自身を理解作っ願ってい

private void button1_Click(object sender, EventArgs e) 
    {    
     lblResult.Text = ""; 
     lblResult2.Text = "";    
     ThreadPool.QueueUserWorkItem(new WaitCallback(Process));    
    } 

    int movement = 0; 
    string CumulateText; 
    private void Process(object stateinfo) 
    { 
     int value; 
     int operation; //0->[+] 1->[-] 
     CumulateText = ""; 
     for (int i = 0; i <= textBox1.Text.Length - 1; i++) 
     { 
      if (textBox1.Text[i] != ' ')     
      { 
       value = (char)textBox1.Text[i] - (char)textBox2.Text[i]; 
       if (value >= 0) 
        operation = 1; 
       else 
        operation = 0; 

       for (int ii = 0; ii <= Math.Abs(value); ii++) 
       { 
        if (operation == 1) 
         movement = (char)textBox1.Text[i] - ii; 
        else 
         movement = (char)textBox1.Text[i] + ii; 

        this.Invoke(new EventHandler(ShowMovement)); 
        System.Threading.Thread.Sleep(10); 
       } 
      } 
      CumulateText += textBox2.Text[i].ToString();     
     } 
    } 

    private void ShowMovement(object sender, EventArgs e) 
    {    
     lblResult.Text = CumulateText + Convert.ToString((char)movement);    
    } 

:ここ

コード(だけで同じな長さを持つテキストのために働く)です。 これを達成するためのアドバイスをお願いします。
出典: 感謝

より多くの私はここに達成したいものを明確にするためには、一例であるジョン・
をConvertTo:ジャック

J - 同じJ
O - (O、N、Mまで減少、...、A)
H - C(H、G、F、まで減少...、C)
N - に対するkまで減少(N、M、L、K)

+0

をConvertTo「言葉 『『を同時に』ソース」とI変換の効果から、すべての文字を表示したい』:

チェックし、そのいずれかの助けがあれば参照、次のコードを学びます - すみません、私はあなたを理解できません。どうか明らかにしてください。 –

+0

この宿題はありますか? –

+0

文字列は不変です。文字列内の複数の文字を同時に置き換えることはできません。古い文字列を削除し、毎回新しい文字列に置き換える必要があります。それらを同時に魔法のように置き換えることによってこれを回避したい場合は、Stringbuilderを使用して、代わりにそれを行うべきです。 – MrFox

答えて

0

私はかつて私が楽しいために取り組んでいた小さなプロジェクトのために似たようなことをしなければなりませんでした。

私はあなたが正しくやっていることを理解していない限り、2文字の間にトランジションを作成するために各文字のスレッドを作成する必要があるのはわかりません。

static class Program 
{ 
    static void Main() 
    { 
     TextTranstition transition = new TextTranstition(); 
     transition.TransitionFinished += TransitionTicked; 
     transition.TransitionTicked += TransitionTicked; 
     transition.StartTransition("AmazingWordTransition", "MyNewWordAppearing", 100); 
     Thread.CurrentThread.Join(); 
     Console.ReadKey(); 
    } 

    public static void TransitionTicked(object sender, TranstitionEventArgs e) 
    { 
     Console.Clear(); 
     Console.Write(e.TransitionText); 
    } 
} 

public class TranstitionEventArgs : EventArgs 
{ 
    private readonly string transitionText; 
    public string TransitionText { get { return this.transitionText; } } 

    public TranstitionEventArgs(string transitionText) 
    { 
     this.transitionText = transitionText; 
    } 
} 


public class TextTranstition 
{ 
    private struct StartInfo 
    { 
     public StartInfo(string initialText, string finalText, int timeStep) 
     { 
      this.initialText = initialText; 
      this.finalText = finalText; 
      this.timeStep = timeStep; 
     } 

     private readonly string initialText; 
     public string InitialText { get { return this.initialText; } } 

     private readonly string finalText; 
     public string FinalText { get { return this.finalText; } } 

     private readonly int timeStep; 
     public int TimeStep { get { return this.timeStep; } } 
    } 

    public EventHandler<TranstitionEventArgs> TransitionFinished; 
    public EventHandler<TranstitionEventArgs> TransitionTicked; 

    public void StartTransition(string initialText, string finalText, int timeStep) 
    { 
     StartInfo startInfo = new StartInfo(initialText, finalText, timeStep); 
     Thread t = new Thread(startTransition); 
     t.Start(startInfo); 
    } 

    private void startTransition(object info) 
    { 
     StartInfo startInfo = (StartInfo)info; 
     string initialText = startInfo.InitialText; 
     string finalText = startInfo.FinalText; 

     if (initialText.Length < finalText.Length) 
     { 
      initialText = initialText.PadRight(finalText.Length); 
     } 

     if (TransitionTicked != null) TransitionTicked(this, new TranstitionEventArgs(initialText)); 

     while ((initialText = transition(initialText, finalText)) != finalText) 
     { 
      Thread.Sleep(startInfo.TimeStep); 
      if (TransitionTicked != null) TransitionTicked(this, new TranstitionEventArgs(initialText)); 
     } 

     if (TransitionFinished != null) TransitionFinished(this, new TranstitionEventArgs(finalText)); 
    } 

    private string transition(string initialText, string finalText) 
    { 
     StringBuilder b = new StringBuilder(finalText.Length); 

     for (int i = 0; i < finalText.Length; i++) 
     { 
      char c = initialText[i]; 
      int charCode = (int)c; 

      if (c != finalText[i]) 
      { 
       if (charCode == 122 || charCode==32) charCode = 65; 
       else if (charCode == 90) charCode = 97; 
       else 
       { 
        charCode += 1; 
       } 
      } 

      b.Append((char)charCode); 
     } 

     return b.ToString(); 
    } 
} 
+0

それは素晴らしいと複雑すぎる、まさに私が探していた、今私はそれを理解する必要があります:]ありがとうたくさん – Somebody

+0

@誰か:現在の実装は '' a'''''''''''''''''''''''''''''''''' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'transition()'の 'char'シフトロジックを変更することでそれを変更できます。 – InBetween

-1

使用BackgroudWorkerこの種のもの。

+0

ここで私の主な関心事は、複数のスレッド(1文字につき1つ)を作成し、文字変換を "ConvertTo"ワードに対応するものと同じ関数を呼び出すことで、変換する特定の文字と同じグローバル変数を使用します。 – Somebody