使用多个项目检查列表框中的重复项

时间:2015-03-05 19:09:05

标签: c# listbox duplication

我必须制作一个播放列表,我可以在其中添加歌曲标题,艺术家和持续时间。我可能不会两次添加相同的歌曲(标题,艺术家和持续时间相同),当我尝试添加具有相同标题和艺术家但具有不同持续时间的歌曲时,我必须保持持续时间最长的歌曲。

这是我现在的代码:

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

    private void btnAdd_Click(object sender, EventArgs e)
    {
        if (String.IsNullOrEmpty(txtTitle.Text) || String.IsNullOrEmpty(txtArtist.Text) || String.IsNullOrEmpty(txtDuration.Text) || System.Text.RegularExpressions.Regex.IsMatch(txtDurationr.Text, "[^0-9]"))
        {
            MessageBox.Show("No valid entry");
        }

        else
        {
            String title = Convert.ToString(txtTitle.Text);
            String artist = Convert.ToString(txtArtist.Text);
            double duration = Convert.ToDouble(txtDuration.Text);

            if (listBox.Items.Contains(txtTitle.Text) && listBox.Items.Contains(txtArtist.Text) && listBox.Items.Contains(txtDuration.Text))
            {
                MessageBox.Show("This already exists");
            }
            else
            {
                listBox.Items.Add("Title: " + title + ", Artist: " + artist + ", Duration: " + duration);
            }

        }
    }

    private void btnReset_Click(object sender, EventArgs e)
    {
        listBox.Items.Clear();
    }
}

我检查复制的方法不起作用,我不知道当我拥有相同的标题和艺术家但持续时间不同时我怎么能做到这一点。

但是检查重复是最重要的

提前致谢

4 个答案:

答案 0 :(得分:0)

您目前正在检查项目集合中是否存在任何值(标题,艺术家,持续时间), 。此外,必须有完全匹配(与标题完全匹配的项目,以及与艺术家完全匹配的项目等)。

你永远不会找到这样的匹配,你的“重复检测”永远不会受到重创。

if (listBox.Items.Contains(txtTitle.Text)
    && listBox.Items.Contains(txtArtist.Text)
    && listBox.Items.Contains(txtDuration.Text))

相反,请检查包含所有您正在测试的值的任何单个项目:

if (listBox.Items.Cast<string>()
     .Any(x => x.Contains(title) && x.Contains(artist) && x.Contains(txtDuration.Text))

强制转换为字符串是必要的,因为Items可以是任何对象的集合,但您当前正在使用字符串。

如果您创建了一个类来定义“歌曲”并使用它来填充ListBox,那就更清晰了。 ListBox上有一些属性可以定义向用户显示哪个属性。)

public class Song
{
    public string Title { get; set; }
    public string Artist { get; set; }
    public double Duration { get; set; }
}

然后你可以执行类似的检查,但更清洁:

if (listBox.Items.Cast<Song>()
     .Any(x => x.Title == title && x.Artist == artist && Duration == duration)

答案 1 :(得分:0)

问题:山姆,为什么不删除持续时间检查?如果您已经检查了标题和艺术家,这是否真的有必要?也许你改变if条件?

简单的解决方案:

if ((listBox.Items.Contains(txtTitle.Text) && listBox.Items.Contains(txtArtist.Text) || 
((listBox.Items.Contains(txtTitle.Text) && listBox.Items.Contains(txtDuration.Text)))
{
        MessageBox.Show("This already exists");
}
else
{
      listBox.Items.Add("Title: " + title + ", Artist: " + artist + ", Duration: " + duration);
}

您的代码的另一个小改进:使用String.ToUpperString.ToLower,这样您就可以避免使用Title1和TiTlE1等检查。

答案 2 :(得分:0)

首先检查标题和艺术家是否已经存在。如果需要,使用for循环遍历项目。如果是,则将该列表框项的文本存储到字符串中,并将具有持续时间的部分提取到另一个字符串变量。使用convert.Todouble将变量转换为double。如果此double值小于double变量'duration',则执行下一次检查。如果是,则添加到列表框中。

答案 3 :(得分:0)

通过改变我的if语句:

if(listBox.Items.Cast()。Any(x =&gt; x.Contains(titel)&amp;&amp; x.Contains(artiest)&amp;&amp; x.Contains(txtDuur.Text)))< / p>

我的问题解决了