防止将重复项从剪贴板添加到列表框
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();
}
}
如何防止从剪贴板向列表框添加重复链接?
这是我的代码。
我使用了正则表达式,以便在剪贴板仅包含 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();
}
}