【问题标题】:Prevent adding duplicate items from Clipboard to ListBox防止将剪贴板中的重复项添加到列表框
【发布时间】:2020-06-27 16:41:11
【问题描述】:

如何防止将剪贴板中的重复链接添加到列表框?

这是我的代码。

我使用了正则表达式,以便在剪贴板仅包含 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 模式将只获取https 方案的有效网址。地址如www.x.netgoogle.comftp://...、..等。将被忽略。那是你要的吗?否则,请查看this 帖子了解更多正则表达式模式。
  • 不,这与正则表达式无关。这是关于避免重复项目。我只是把正则表达式放在以防有人会问。我对那个正则表达式很好。因为我只有特定的链接来加载不是全部。

标签: c# listbox uri clipboard


【解决方案1】:

使用 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());

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

【讨论】:

  • 哇,这就是我要找的。我现在就试试 非常感谢
  • 我可以再问一次吗?我如何使用它来添加多个文件?我现在将它用于其他代码。但无法从本地添加文件
  • 当然。比如:listBox1.Items.AddRange(localFilesArray.Where(f =&gt; !listBox1.Items.Cast&lt;string&gt;().Any(item =&gt; item.Equals(f, StringComparison.InvariantCultureIgnoreCase))).ToArray());
  • 又成功了 :) 非常感谢。我不需要使用我的旧课程来删除重复项。这更容易
  • 你好@JQSOFT 我想问如何使用它来添加列表视图子项?我目前正在我的列表框中使用您的代码,现在我的问题是列表视图项目。我想防止添加多个项目
【解决方案2】:

谢谢@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();
                }
            } 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多