C# 将列表元素与用户输入的字符串进行比较时,似乎只比较最后输入的列表元素

C# 将列表元素与用户输入的字符串进行比较时,似乎只比较最后输入的列表元素,c#,winforms,list,string-comparison,C#,Winforms,List,String Comparison,我的程序有一个人员列表和一个活动列表,程序的工作是向进入列表的人员出售这些活动的门票 我是一个舞台,我需要在功能中编程,允许用户选择他们想要购买门票的演出/活动。我决定在RichTextBox中显示可用的事件,并要求用户输入他们想要购买门票的事件的名称。如果出现此事件,则计划应提前至客户详细信息表;如果没有,那么它应该重置输入文本框,并向用户显示一条错误消息-足够简单 但是,由于某种原因,当我尝试搜索列表并将字符串ChosenArtister与event.getArtister方法进行比较时,对

我的程序有一个人员列表和一个活动列表,程序的工作是向进入列表的人员出售这些活动的门票

我是一个舞台,我需要在功能中编程,允许用户选择他们想要购买门票的演出/活动。我决定在RichTextBox中显示可用的事件,并要求用户输入他们想要购买门票的事件的名称。如果出现此事件,则计划应提前至客户详细信息表;如果没有,那么它应该重置输入文本框,并向用户显示一条错误消息-足够简单

但是,由于某种原因,当我尝试搜索列表并将字符串ChosenArtister与event.getArtister方法进行比较时,对于列表中实际存在的项目,它返回为“未找到”。它实际返回的唯一项似乎是最后输入的列表项

例如:

丑角 唱歌的人 舞者 比较功能会告诉我小丑和歌手不存在,但舞蹈演员存在

我认为这与foreach循环中的代码或Events类的实际代码有关,但我不知道

AddCustomer表单的代码 比较是在btnFind\u单击中完成的


还需要注意的是,例如,如果在foreach循环中,我更改了RichTextBox中的文本,以便只打印出艺术家的姓名,那么效果很好。只有当我试图将这些名称与我遇到问题的内容进行比较时,才出现这种情况。

下面的事件处理程序导致了这个问题。如果我在文本框中输入“Singer”并单击“查找”,请选中。它会将其与导致不匹配的第一项小丑进行比较,然后将其与匹配的歌手进行比较。但你们继续把它和下一个舞者进行比较,这也是不匹配的。一旦找到匹配项,您需要中断循环:

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中的自动属性。如果由某些C开发人员编写,您的事件类将如下所示

公开课活动 { 公共字符串艺术家{get;set;} 公共字符串地址{get;set;} 公共字符串日期{get;set;} 公共字符串容量{get;set;} 剩余公共字符串{get;set;} 公共字符串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; 
}
}


另外,请考虑为日期、价格、容量等选择适当的数据类型。

旁注:您的示例看起来像Java代码,或者略为采用Java。请使用C语言中的属性。自动实现的属性可能适用于您的情况,如公共字符串容量{get;set;}。@AlexeiLevenkov问题出在btnFind click处理程序中。他在成功的比赛后并没有打破循环,下一次的比较结果是没有found@TheVillageIdiot-明白了。。。AddCustomer的名称与waht代码完全无关-因此看起来可能是个问题…当您可以给用户一些机制来选择事件名称时,为什么要要求用户键入事件名称?这似乎比任何事情都更让用户恼火。如果你正在制作一个搜索框,其中列出了一个匹配或类似的项目列表,用户可以从中进行选择,那么就可以了。+1。使用Enumerable.first或Default或Enumerable.Any会使代码更干净,更难出错。@AlexeiLevenkov当然可以,但由于他是C语言的新手,这需要一些时间。@TheVillageIdiot感谢您的帮助和答案,意识到修复是多么简单,我觉得有点傻!我一直在玩写文本文件的游戏,所以把所有的东西都设置为字符串,完全忘记了把它们改回正确的格式。现在一切都解决了。我在学习java时学习了set和get,甚至从未想过要修改它,但后来我研究了用c语言来实现它。再次感谢!
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();
    }
}
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; 
}