将对象存储到列表并搜索它们

时间:2013-04-09 05:40:29

标签: c# list search textbox

我希望能够在列表中创建一系列对象,然后在该列表中搜索特定结果(可能有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; 
        }
    }
}

3 个答案:

答案 0 :(得分:2)

您忘记使用+=代替=

albumResultBox.Text += String.Join(Environment.NewLine, item.Name + " " + item.Artist);

答案 1 :(得分: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 };

答案 2 :(得分: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。