c # словарь и forloop / запись в текст путаница - как сделать это пройти один раз, а не через каждую итерацию - PullRequest
1 голос
/ 05 июля 2011
    using System;
using System.IO;
using System.Collections.Generic;
using System.Threading;
using System.Diagnostics;

namespace ConsoleApplication9
{
    class main
    {
        private static StreamWriter objWriter = new StreamWriter(@"D:\text1.txt", true);
        private static StreamWriter tripWriter = new StreamWriter(@"D:\text2.txt", true);

        private static void Main()
        {
            WelcomeMenu();
        }
        public static void WelcomeMenu()
        {
            Console.WriteLine("Welcome to Pow Drop Log v1");
            Console.WriteLine("A. Press A to start the trip");
            while (true)
            {
                string enteredWelcome = Console.ReadLine();
                {
                    if (enteredWelcome == "a")
                    {
                        List();
                    }
                    else
                    {
                        Console.WriteLine("That is an invalid option");
                        continue;
                    }
                }

            }
        }
        public static void WriteToTextFile(string text)
        {
            objWriter.Write(text);
            objWriter.Flush();
        }
        public static void WriteToCurrentTrip(string text)
        {
            tripWriter.Write(text);
            tripWriter.Flush();
        }
        public static void List()
        {
            Stopwatch Triptime = new Stopwatch();
            Triptime.Start();
            Console.WriteLine("You have started the trip");
            Dictionary<string, string> tdItems = new Dictionary<string, string>();
            tdItems.Add("1", "foo");
            tdItems.Add("2", "bar");
            tdItems.Add("3", "bar");
            tdItems.Add("4", "end");
            while (true)
            {
                string[] items = Console.ReadLine().Split(' ');
                string result = null;
                int result1;
                TimeSpan timeSpan = Triptime.Elapsed; string time = string.Format("{0:00}:{1:00}:{2:00}", timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds);
                foreach (string itemNumber in items)
                {
                    if (tdItems.ContainsKey(itemNumber) && (int.TryParse(itemNumber, out result1)))
                    {
                        result += " + " + tdItems[itemNumber];
                        WriteToTextFile(tdItems[itemNumber] + Environment.NewLine);
                        WriteToCurrentTrip(tdItems[itemNumber] + Environment.NewLine);
                    }
                    if (!tdItems.ContainsKey(itemNumber) && (int.TryParse(itemNumber, out result1)))
                    {
                        Console.WriteLine("You have entered a drop which is not in the database, Try again");
                        continue;
                    }
                    else if (itemNumber == "end")
                    {
                        Triptime.Stop();
                        Console.WriteLine("End of Trip");
                        Console.WriteLine("Elapsed time " + time);
                        Console.WriteLine("");
                        Console.WriteLine("");
                        Console.WriteLine("");
                        Console.WriteLine("");
                        WelcomeMenu();
                        break;
                    }

                }

            }
        }
    }
}

Кажется, что код проходит каждую часть, а не один раз.

Скажем, если я наберу 1 2 3 в консоли, в текстовом файле будет написано

foofoo bar foo bar baz вместо того, чтобы писать foo + bar + baz в первую очередь.

Я отладил его, и он показывает, что он продолжает проходить, как бы я мог это исправить и сделать так, чтобы он это делалэто правильно?.

Спасибо!

1 Ответ

2 голосов
/ 05 июля 2011

Этот код очень плохой, и я рекомендую переписать его, пока он не станет намного короче и проще. Но если бы мне пришлось сделать наименьшее возможное изменение, чтобы распечатать его правильно, я бы изменил это:

WriteToTextFile(result.Substring(3) + Environment.NewLine);
WriteToCurrentTrip(result.Substring(3) + Environment.NewLine);

К этому:

WriteToTextFile(tdItems[itemNumber] + Environment.NewLine);
WriteToCurrentTrip(tdItems[itemNumber] + Environment.NewLine);

РЕДАКТИРОВАТЬ: для справки, вот примерно как я бы написал то, что вы указали, что вы хотели, чтобы ваша функция List делала, с чередованием комментариев. Вы могли бы сделать это еще лучше, но это должно показать вам некоторые полезные вещи. Надеюсь, я правильно понял предполагаемое поведение.

// StartNew happens to be a quicker way to create and initialize a Stopwatch

Stopwatch triptime = Stopwatch.StartNew();
Console.WriteLine("You have started the trip");

// you can use collection initializer syntax to make it nicer to read when
// you want to add lots of things to a data structure

var tdItems = new Dictionary<string, string> {
    { "1", "foo" },
    { "2", "bar" },
    { "3", "baz" },
    { "4", "end" },
};

while (true)
{
    string[] items = Console.ReadLine().Split(' ');

    // you can use format strings to easily customize the stringification
    // of DateTime and TimeSpan objects, see the MSDN docs

    string time = string.Format("{0:c}", triptime.Elapsed);

    List<string> waypoints = new List<string>();

    // it's easiest to first find the destinations your trip has to visit

    foreach (string itemNumber in items)
    {
        if (tdItems.ContainsKey(itemNumber))
            waypoints.Add(tdItems[itemNumber]);
        else
            Console.WriteLine(
              "You have entered a drop which is not in the database...");
    }

    // string.Join is an easy way to avoid worrying about putting an extra
    // "+" at the front or end

    string tripDescription = string.Join(" + ", waypoints);

    // "using" is generally important so you don't hold a lock on the file
    // forever, and it saves you from manually calling "flush" -- it
    // flushes when the writers are disposed at the end of the using block

    using (var objWriter = new StreamWriter(@"D:\text1.txt", true))
    using (var tripWriter = new StreamWriter(@"D:\text2.txt", true))
    {
        // WriteLine adds a newline for you

        objWriter.WriteLine(tripDescription);
        tripWriter.WriteLine(tripDescription);
    }

    if (waypoints.Contains("end"))
    {
        Console.WriteLine("End of Trip");
        Console.WriteLine("Elapsed time " + time);
        Console.WriteLine("");
        Console.WriteLine("");
        Console.WriteLine("");
        Console.WriteLine("");
        break;
    }
}

// you'll get the welcome menu again when you return from this function

Если вы разбиваете то, что делает ваш код, на маленькие, проверяемые фрагменты, это будет намного легче понять, проверить и отладить. В моей версии вы можете видеть, что он получил правильные путевые точки; тогда вы можете видеть, что описание выглядит правильно; тогда вы можете увидеть, что он записал в файл. В твоем случае это попытка сделать все одновременно, и с ним труднее работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...