【问题标题】:Storing objects to a list and searching for them将对象存储到列表并搜索它们
【发布时间】:2013-03-31 10:04:42
【问题描述】:

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

【问题讨论】:

    标签: c# list search textbox


    【解决方案1】:

    您忘记使用+= 而不是=

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

    【讨论】:

    • ... 1 个字符。非常非常感谢!
    • 这是一个简单的答案。我不会那么完美,请参阅下面的详细信息。既然你喜欢它,为什么不把它标记为接受呢? (点击勾号)
    【解决方案2】:

    在每次迭代中,您都会覆盖文本框中的文本。您应该附加到它。 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 };
    

    【讨论】:

    • 这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
    • 是的,它确实提供了答案。与接受的相同。它也是在火车上写在手机上的,所以格式化文本有点困难。现在编辑它。
    • ya..okie.. 我在查看 low quality posts 时遇到了这篇文章。当时它只包含1句话。所以我认为这是低质量的。
    【解决方案3】:

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

    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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      相关资源
      最近更新 更多