2013-04-09 89 views
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; 
     } 
    } 
} 

回答

2

你忘了使用+=代替=

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

... 1个字符。非常非常感谢你! – mansonitefirefox 2013-04-09 05:45:30

+0

谁投下了这个?这是完美的答案。 – mansonitefirefox 2013-04-09 05:46:36

+0

这是一个简单的答案。我不会那么完美,详情请看下文。既然你喜欢它,为什么不把它标为接受? (请点击打勾) – 2013-04-09 05:58:34

0

在每次覆盖在文本框中的文本迭代。你应该追加它。 另外TextBox.Text永远不为null。

这条线将永远不会添加专辑王氏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 }; 
+0

这不会提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 – Renjith 2013-04-09 06:13:08

+0

是的,它提供了一个答案。与接受的一样。另外它在火车上写在手机上,所以格式化文本有点困难。现在编辑它。 – 2013-04-09 06:30:36

+0

ya..okie ..我在回顾'低质量帖子'时遇到这篇文章。那时它只包含一句话。所以我认为这是低质量。 – Renjith 2013-04-09 09:50:59

0

你正在积累状态恢复的所有专辑。字符串是不可变的,每次调用+ =都会为每次迭代创建一个新的字符串对象。在你的情况下,它可能不会重要,但作为形式的问题,你应该做这样的:

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

然后从sb.ToString()

提取成品​​串您可以通过大大提高你的代码的legibiity压倒一切的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。

相关问题