在比较列表元素和用户输入的字符串时,似乎只比较最后输入的列表元素

本文关键字:输入 列表元素 比较 最后 用户 字符串 | 更新日期: 2023-09-27 18:12:10

我的程序有一个人员列表和一个事件列表,程序的工作是向列表中输入的人出售这些事件的门票。

我是一个舞台,我需要在功能中编程,允许用户选择他们想要购买门票的节目/事件。我决定通过在RichTextBox中显示可用事件并要求用户写下他们想要购买门票的事件名称来做到这一点。如果此事件存在,则程序应提前到客户详细信息表单;如果没有,那么它应该重置输入文本框,并显示一个错误消息给用户-很简单。

然而,由于某种原因,当我尝试搜索列表并将字符串"chosenArtist"与event.getArtist()方法进行比较时,它返回的是没有找到列表中实际存在的项目。它实际返回的唯一项似乎是最后输入的列表项。

例如:

  1. 歌手
  2. 舞者

比较函数会告诉我小丑和歌手不存在,但舞者存在。

我认为这与我在foreach循环内的代码或事件类的实际代码有关,但我只是不知道。

AddCustomer表单的代码(比较在btnFind_click内完成)

public partial class AddCustomer : Form
{
    //arrayList
    List<Person> personList = new List<Person>();
    List<Events> eventsList = new List<Events>();
    //class
    Person p = new Person();
    Events ev = new Events();
    //variables 
    String chosenArtist;
    //constructors
    public AddCustomer()
    {
        InitializeComponent();
    }
    public AddCustomer(List<Events> eventsList, List<Person> personList)
    {
        InitializeComponent();
        this.personList = personList;
        this.eventsList = eventsList;
    }
    private void btnHome_Click(object sender, EventArgs e)
    {
        formHome home = new formHome();
        this.Hide();
        home.Show();
    }
    private void AddCustomer_Load(object sender, EventArgs e)
    {
        //sets error label text to blank
        lblCustomerError.Text = "";
        //sets display for rich text box
        rtbAddCust.Text = "Events'n";
        foreach (Events ev in eventsList)
        {
            rtbAddCust.AppendText("Artist name: " + ev.getArtist() + "'n" +
                             "Event venue: " + ev.getVenue() + "'n" +
                             "Event date: " + ev.getDate() + "'n" +
                             "Capacity: " + ev.getCapacity() + "'n" +
                             "Price: £" + ev.getPrice() + "'n" +
                             "Remaining tickets: " + ev.getRemaining() + "'n'n");
        }
        //Ensures curser always starts at top of text box
        rtbAddCust.SelectionStart = 0;
        rtbAddCust.ScrollToCaret();
    }
    private void btnFind_Click(object sender, EventArgs e)
    {
        chosenArtist = txtFindArtist.Text;
        foreach(Events ev in eventsList)
        {
            //compares chosen artist to list items to determine if present
            if (ev.getArtist().ToLower().Equals(chosenArtist.ToLower()))
            {
                lblCustomerError.Text = "Artist found";
                //do something
            }
            else
            {
                lblCustomerError.Text = "artist not found";
                txtFindArtist.Clear();
            }
        } 
    }
}

Events类代码

public class Events
{
   private String artist;
   private String venue;
   private String date;
   private String capacity;
   private String remaining;
   private String price;
    public Events() { }
    public Events(String artist, String venue, String date, String capacity, String remaining, String price ) 
    {
        this.artist = artist;
        this.venue = venue;
        this.date = date;
        this.capacity = capacity;
        this.remaining = remaining;
        this.price = price;
    }
    //setters
    public void setArtist(String artist) { this.artist = artist; }
    public void setVenue(String venue) { this.venue = venue; }
    public void setDate(String date) { this.date = date; }
    public void setCapacity(String capacity) { this.capacity = capacity; }
    public void setRemaining(String remaining) { this.remaining = remaining; }
    public void setPrice(String price) { this.price = price; }
    //getters
    public String getArtist() { return artist; }
    public String getVenue() { return venue; }
    public String getDate() { return date; }
    public String getCapacity() { return capacity; }
    public String getRemaining() { return remaining; }
    public String getPrice() { return price; }
    //toString
    public override String ToString() { return artist + " " + venue + " " + date + " " + capacity + " " + remaining + " " + price; }
同样值得注意的是,如果在foreach循环中,我改变了RichTextBox中的文本,只打印出艺术家的名字,这很好。似乎只有当我试图将这些名称与某些东西进行比较时,我才会遇到问题。

在比较列表元素和用户输入的字符串时,似乎只比较最后输入的列表元素

下面的事件处理程序导致问题。检查if,假设我在文本框中输入"歌手",然后单击查找。它将与第一个项目Clown进行比较,结果不匹配,然后与Singer进行比较,这是匹配的。但是你继续将它与下一个项目Dancer进行比较,这又是一个不匹配。一旦找到匹配,您需要从循环中执行break:

private void btnFind_Click(object sender, EventArgs e)
{
    chosenArtist = txtFindArtist.Text;
    foreach(Events ev in eventsList)
    {
        //compares chosen artist to list items to determine if present
        if (ev.getArtist().ToLower().Equals(chosenArtist.ToLower()))
        {
            lblCustomerError.Text = "Artist found";
            //do something
            break;//BREAK FROM LOOP
        }
        else
        {
            lblCustomerError.Text = "artist not found";
            txtFindArtist.Clear();
        }
    } 
}

一个更简洁的实现可能是这样的:

private void btnFind_Click(object sender, EventArgs e)
{
    chosenArtist = txtFindArtist.Text.ToUpperInvariant;
    var found=false;
    foreach(Events ev in eventsList)
    {
        if (ev.getArtist().ToUpperInvariant().Equals(chosenArtist))
        {
            found=true;
            break;//BREAK FROM LOOP
        }
    } 
    if(found){
        lblCustomerError.Text = "Artist found";
        //Do booking stuff
    }
    else
    {
        lblCustomerError.Text = "Artist not found";
        txtFindArtist.Clear();
    }
}
正如@AlexiLevenkov所指出的,你可以利用c#中的自动属性。如果你的Event类是由c#开发人员编写的,那么它将是这样的。

公共类Events{公共字符串艺术家{get;set;}public String Venue {get;set;}public String Date {get;set;}public String Capacity {get;set;}public String Remaining {get;set;}public String Price {get;set;}

public Events() { }
public Events(String artist, String venue, String date, String capacity,
                                               String remaining, String price ) 
{
    Artist = artist;
    Venue = venue;
    Date = date;
    Capacity = capacity;
    Remaining = remaining;
    Price = price;
}
public override String ToString()
{ 
    return artist + " " + venue + " " + date + " " + capacity + " " + 
               remaining + " " + price; 
}

}

也要考虑为Date, Price, Capacity等采取适当的数据类型。