0

我希望能够在列表中创建一系列对象,然后在该列表中搜索特定结果(可能有 0、1 或许多命中),然后在文本框中显示结果。

这是我到目前为止所拥有的,但我似乎只能显示我输入的最后一个对象。

public partial class OrganiserWindow : Form
{
    public OrganiserWindow()
    {
        InitializeComponent();
    }

    List<Album> AlbumList = new List<Album>();

    private void createAlbum_Click(object sender, EventArgs e)
    {
        AlbumList.Add(new Album(albumBox.Text, artistBox.Text));
    }

    private void searchAlbum_Click(object sender, EventArgs e)
    {
        var albumResult = from album in AlbumList
                          where album.AlbumName != null// == albumBox.Text
                          select new { Name = album.AlbumName, Artist = album.ArtistName };

        foreach (var item in albumResult)
        {
            albumResultBox.Text = String.Join(Environment.NewLine, item.Name + " " + item.Artist);
        }
    }
}

public class Album
{
    private string albumName;
    private string artistName;

    public Album(string album, string artist)
    {
        albumName = album;
        artistName = artist;
    }

    public string AlbumName
    {
        get 
        { 
            return albumName; 
        }
        set 
        { 
            albumName = value; 
        }
    }

    public string ArtistName
    {
        get 
        { 
            return artistName; 
        }
        set 
        { 
            artistName = value; 
        }
    }
}
4

3 回答 3

2

你忘了使用+=而不是=

albumResultBox.Text += String.Join(Environment.NewLine, item.Name + " " + item.Artist);
于 2013-04-09T05:43:46.143 回答
0

在每次迭代中,您都会覆盖文本框中的文本。您应该附加到它。TextBox.Text 也永远不会为空。

此行将永远不会添加 AlbumName == null 的专辑

AlbumList.Add(new Album(albumBox.Text, artistBox.Text));

因此,当您运行此查询时,您始终会返回所有专辑

var albumResult = from album in AlbumList
                  where album.AlbumName != null
                  select new { Name = album.AlbumName, Artist = album.ArtistName };
于 2013-04-09T05:44:53.767 回答
0

你正在积累状态。字符串是不可变的,每次调用 += 都会为每次迭代创建一个新的字符串对象。在您的情况下,这可能无关紧要,但就形式而言,您应该这样做:

StringBuilder sb = new StringBuilder();
...
sb.AppendFormat("{0} {1}\r\n", item.AlbumName, item.ArtistName);

然后从中提取完成的字符串sb.ToString()

您可以通过重写 ToString() 大大提高代码的易读性

public class Album
{
    public Album(string album, string artist)
    {
        albumName = album;
        artistName = artist;
    }

    public string AlbumName { get; set; }
    public string ArtistName { get; set; }

    public override string ToString() 
    {
        return string.Format("{0} {1}", AlbumName, ArtistName);
    }
}

允许你写

sb.AppendLine(item);

AppendLine 隐式调用 ToString 然后附加 CRLF。

于 2013-04-09T05:55:59.870 回答