开发者

c# text difference

开发者 https://www.devze.com 2023-03-14 06:23 出处:网络
I have two words: Source:John ConvertTo: Jack and I want to show the effect of convert all letters from \"Source\" at the same time to the \"ConvertTo\" word. I already create a program to accomplish

I have two words:

Source: John

ConvertTo: Jack

and I want to show the effect of convert all letters from "Source" at the same time to the "ConvertTo" word. I already create a program to accomplish that but processing one letter at a time, to show the effect I use Threads, the thing is that to process all letters at the same time I suppose I need one thread per letter, and every thread will call the same function that process the letter, and I use global variables.

Here is the code (works only for texts with same lenght):

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);            
    }

I hope I made myself understood. please any advise to accomplish that. thanks

To clarify more what I want to accomplish here is an example:

Source: John

ConvertTo: Jack

J - same J

o - decrease till a (o, n, m, ..., a)

h - decreas开发者_JS百科e till c (h, g, f, ..., c)

n - decrease till k (n, m, l, k)


I once had to do something similar for a small little project I was working on for fun.

I do not see why you would need to create a thread for each letter to create a transition between two words unless I'm not understanding what you are pretending to do correctly.

Check and study the following code, see if its any help:

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();
    }
}


Use BackgroudWorker for this kind of stuff.

0

精彩评论

暂无评论...
验证码 换一张
取 消