.. kiedy użytkownik wprowadza się do nazwiska, chłopca i / lub dziewczyny, moja wiadomość drukuje na ekran, mówiąc, że nazwa istnieje na liście i kolejna wiadomość po stwierdzeniu, że nazwa nie istnieje na liście. Próbowałem różnych sposobów z moimi stwierdzeniami, ale po prostu nie działa dobrze dla mnie. Czy ktoś ma jakiś pomysł, gdzie bałam się mój kod? Kod poniżej

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace Chapter7_problem6_
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void checkButton_Click(object sender, EventArgs e)
        {
            StreamReader inputFile1 = File.OpenText("BoyNames.txt");
            StreamReader inputFile2 = File.OpenText("GirlNames.txt");

            // create new lists to store boys and girls names
            List<string> boysList = new List<string>();
            List<string> girlsList = new List<string>();
            
            // read boy names file and add to list
            while (!inputFile1.EndOfStream)
            {
                boysList.Add(inputFile1.ReadLine());
            }

            // read girl names file and add to list
            while (!inputFile2.EndOfStream)
            {
                girlsList.Add(inputFile2.ReadLine());
            }

            // close file
            inputFile2.Close();

            // call display answer method
            displayBoyAnswer(boysList);
            displayGirlAnswer(girlsList);
        }

        // method to validate users choice and display message
        private void displayBoyAnswer(List<string> list1)
        {
            int position1;
            position1 = list1.IndexOf(boyBox.Text);

            if (position1 != -1)
            {
                MessageBox.Show(boyBox.Text+ " is a popular name!");
            }
            if (position1 == -1)
            {
                MessageBox.Show(boyBox.Text+ " is not a name on the popular names list.");
            }

        }

        private void displayGirlAnswer(List<string> list2)
        {
            int position2;
            position2 = list2.IndexOf(girlBox.Text);

            if (position2 != -1)
            {
                MessageBox.Show(girlBox.Text + " is a popular name!");
            }
            if (position2 == -1)
            {
                MessageBox.Show(girlBox.Text + " is not a name on the popular names list");
            }
        }
        
    }
}
0
Fitzgerald 27 marzec 2021, 05:29

3 odpowiedzi

Najlepsza odpowiedź

Założenia:

  • Masz dwa textboxes, jeden dla chłopca, jeden dla dziewczyny. W ten sposób wiesz, że użytkownik chce przeszukać nazwiska dziewczyny dla "Lee", a nie imion chłopców (Lee jest zazwyczaj nazwa unisex)
  • Tylko jeden z pudełek zostanie wypełniony przez użytkownika (dość niebezpieczne założenie, BTW)

Napisałeś dużo kodu, który może być bardziej zwięźle wyrażony jako:

bool popBoy = boyBox.Text != "" && File.ReadAllLines("boynames.txt").Contains(boyBox.Text);
bool popGirl = girlBox.Text != "" && File.ReadAllLines("girlnames.txt").Contains(girlBox.Text);

if(popBoy || popGirl)
  MessageBox.Show("it's a popular name");
else
  MessageBox.Show("it's not a popular name");

Możesz podzielić go inaczej, jeśli chcesz być bardziej informacyjny (i usunąć "tylko jedno pudełko" wypełniony "ograniczenie)

MessageBox.Show("it " + (popBoy?"is":"is not") + a popular boy name");
MessageBox.Show("it " + (popGirl?"is":"is not") + a popular girl name");
0
Caius Jard 27 marzec 2021, 05:59

Tylko kilka wskazówek, które mogą pomóc w przyszłości. Dla początkujących, gdy widzisz kod, który wygląda dokładnie tak samo, z wyjątkiem niektórych części jak zarówno displayBoyAnswer i displayGirlAnswers ... to ... To jest duża czerwona flaga, która krzyczy ... "Zrób Metoda tego kodu i przejść w różnych częściach. " ... W ten sposób, zamiast powtarzać ten sam kod, możesz mieć jedną metodę, która działa zarówno dla chłopca, jak i dziewczyny.

Co to jest "inaczej" w dwóch metodach? 1) Lista, w której chcemy wyszukać, tj ... The Boy lub Girl List. 2) Nazwa chcemy wyszukać 3) wartość łańcucha, aby wyświetlić użytkownika "Chłopiec" lub "Dziewczyna".

Moglibyśmy nazwać tę metodę czegoś takiego jak ... {x0}} i przejść na liście, w której chcemy wyszukać, nazwę, którą chcemy wyszukać i chłopca lub dziewczynę string chcemy wysychać do użytkownika. Coś jak…

private void DisplayAnswer(List<string> listToCheck, string name, string bORg) {
  if (!string.IsNullOrWhiteSpace(name)) {
    if (listToCheck.Contains(name)) {
      MessageBox.Show(bORg + " Name: " + name + " is a favorite name");
    }
    else {
      MessageBox.Show(bORg + " Name: " + name + " is NOT a favorite name");
    }
  }
}

Ta metoda będzie działać zarówno dla listów, jak i chłopców, bez dwukrotnego powtarzania tego samego kodu.

Również powtarzający się kod podczas czytania listy nazw z plików dziewcząt i chłopca. Załóżę, że lista nie musi być odczytywana "Każdy" czas naciska użytkownika. Tak więc łatwiej jest utworzyć listę dziewczyny, jak i chłopców jako zmienne globalne i wypełnić je "raz", gdy formularz ładunki. W ten sposób plik jest czytany tylko raz. Poniższy kod używa oświadczenia using, które zapewnia prawidłowe zamknięcie pliku. Coś, w czym twój obecny kod jest zaniedbujący z inputFile1 nigdy nie jest zamknięty. ...

List<string> boysList;
List<string> girlsList;

public Form1() {
  InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) {
  boysList = GetNamesList("BoyNames.txt");
  girlsList = GetNamesList("GirlNames.txt");
}

private List<String> GetNamesList(string filePath) {
  List<string> names = new List<string>();
  using (StreamReader inputFile = File.OpenText(filePath)) {
    while (!inputFile.EndOfStream) {
      names.Add(inputFile.ReadLine());
    }
  }
  return names;
}

Wreszcie, ponieważ podajesz wymóg, aby użyć tylko jednego przycisku, a następnie podano nową metodę DisplayAnswer powyżej, może wyglądać jak ...

private void checkButton_Click(object sender, EventArgs e) {
  DisplayAnswer(boysList, boyBox.Text.Trim(), "Boy");
  DisplayAnswer(girlsList, girlBox.Text.Trim(), "Girl");
}

Powodzenia i zawsze szukaj wskazówek czerwonych flag, które ułatwi ci coś łatwiej.

0
JohnG 27 marzec 2021, 04:22

Dobra, przepraszam, właśnie to zrozumiałem. Musiałem potwierdzić, czy wprowadzono wkład, czy nie został wysłany wewnątrz jednej z pola tekstowego. Użyłem więc innego, jeśli oświadczenie o innym w moich metodach stwierdzając, że jeśli długość jednej z pola tekstowego była większa niż 0, a następnie kontynuuj innymi instrukcjami.

private void displayBoyAnswer(List<string> list1)
        {
            int position1;
            position1 = list1.IndexOf(boyBox.Text);
            if (boyBox.Text.Length > 0)
            {
                if (position1 != -1)
                {
                    MessageBox.Show(boyBox.Text + " is a popular name!");
                }
                if (position1 == -1)
                {
                    MessageBox.Show(boyBox.Text + " is not a name on the popular names list.");
                }
            }
           

        }

        private void displayGirlAnswer(List<string> list2)
        {
            int position2;
            position2 = list2.IndexOf(girlBox.Text);
            if (girlBox.Text.Length > 0 )
            {
                if (position2 != -1)
                {
                    MessageBox.Show(girlBox.Text + " is a popular name!");
                }
                if (position2 == -1)
                {
                    MessageBox.Show(girlBox.Text + " is not a name on the popular names list");
                }
            }
            
        }
-1
Fitzgerald 27 marzec 2021, 02:56