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