防止将重复项从剪贴板添加到列表框

Prevent adding duplicate items from Clipboard to ListBox

如何防止从剪贴板向列表框添加重复链接?

这是我的代码。

我使用了正则表达式,以便在剪贴板仅包含 URL 时可以轻松添加

private void AddLinks()
{
    string[] linkItems = Clipboard.GetText().Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
    Regex regURL = new Regex("https:(.*)", RegexOptions.Compiled | RegexOptions.Multiline);

    foreach (string link in linkItems)
    {
        MatchCollection url = regURL.Matches(link);
        LIST_URL.BeginUpdate();
        foreach (Match m in url)
        {
            LIST_URL.Items.Add(m);
        }
        LIST_URL.EndUpdate();
    }
}

使用 Regex 和给定的模式,从剪贴板获取 Urls(如果有的话),并将不同的 Urls 插入到 ListBox 中:

private void AddLinks() =>
    LIST_URL.Items.AddRange(
        Regex.Matches(Clipboard.GetText(), @"https:(.*)*", 
            RegexOptions.Multiline | RegexOptions.IgnoreCase)
        .Cast<Match>()
        .Where(m => !LIST_URL.Items.Cast<string>()
        .Any(item => item.Equals(m.Value, StringComparison.InvariantCultureIgnoreCase)))
        .Select(m => m.Value)
        .ToArray()
        );

此外,您可能想尝试 Uri.TryCreate 方法:

private void AddLinks() =>
    LIST_URL.Items.AddRange(Clipboard.GetText()
            .Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries)
            .Where(line => Uri.TryCreate(line, UriKind.Absolute, out Uri uri)
            && uri != null && uri.Scheme == Uri.UriSchemeHttps
            && !LIST_URL.Items.Cast<string>()
            .Any(item => line.Equals(item, StringComparison.InvariantCultureIgnoreCase)))
            .ToArray());

在这两个代码片段中,.where 范围内的 Enumerable.Any 方法从剪贴板中排除了重复的 Urls,并且它们(如果有的话)不会被添加到列表中。

谢谢@jQSOFT 这是最终的固定代码。它 100% 有效。

    private void AddLinks()
    {
        lbURL.Items.AddRange(Regex.Matches(Clipboard.GetText(), @"https?://www.viu.com/(.*)*",
            RegexOptions.Multiline | RegexOptions.IgnoreCase)
            .Cast<Match>()
            .Where(m => !lbURL.Items.Cast<string>()
            .Any(item => item.Equals(m.Value, StringComparison.InvariantCultureIgnoreCase)))
            .Select(m => m.Value)
            .ToArray());
    }

另一个由@jQSOFT 修复的问题也许对其他人也有帮助。 将新项目添加到列表框时防止重复

 using (OpenFileDialog ofd = new OpenFileDialog())
            {
                ofd.Filter = "m3u8 File(*.m3u8)|*.m3u8";
                ofd.RestoreDirectory = true;
                ofd.Multiselect = true;

                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    string[] files = ofd.FileNames;

                    List_URL.BeginUpdate();
                    List_URL.Items.AddRange
                                (files.Where(f => 
                                !List_URL.Items.Cast<string>().Any(item => 
                                item.Equals(f, StringComparison.InvariantCultureIgnoreCase))).ToArray());
                    List_URL.EndUpdate();
                }
            }