【问题标题】:Remove items from List<string> where substring is duplicated (C#)从 List<string> 中删除子字符串重复的项目(C#)
【发布时间】:2021-09-23 11:19:27
【问题描述】:

假设我有一个列表

TEST1 10:05:45
TEST2 10:03:23
TEST3 10:01:28
TEST2 13:03:23
TEST3 16:01:28

我想过滤我的列表并删除名称重复的所有行, 所以我的输出是这样的:

TEST1 10:05:45

这是我迄今为止尝试过的:

List<string> numberList = new List<string>() {
    "TEST1 10:05:45", "TEST2 10:03:23", "TEST3 10:01:28", 
    "TEST2 13:03:23", "TEST3 16:01:28" };
          
foreach (var x in numberList
    .GroupBy(i => i)
    .Where(g => g.Count() == 1)
    .Select(g => g.Key))
{
    MessageBox.Show(x.ToString());
}

不幸的是,这不起作用,因为尽管名称相同,但时间戳却不同

有人知道我可以在这里做什么吗?

【问题讨论】:

  • 在你使用GroupBy()之前你必须使用Split(' ')

标签: c# arrays string list linq


【解决方案1】:

不要使用完整的字符串作为分组键,而是使用第一个空格的子字符串:

numberList
   .GroupBy(i => i.Substring(0, i.IndexOf(' ')))
   .Where(g => g.Count() == 1)
   .Select(g => g.First())

在线演示:https://dotnetfiddle.net/yiCbef

【讨论】:

  • 但是这个 TEST1 我想要 TEST 1 10:05:45 编辑:现在可以工作了,非常感谢
  • @OlivierJacot-Descombes 如果字符串很长并且包含更多空格,这将导致不必要的字符串分配。
  • 是的,但它的优点是即使没有空格字符也能正常工作。
  • @HassanAblatar,这是完全不同的情况,因为您在问题中发布了并且完全无效(好的)到目前为止给出的答案。
  • @HassanAblatar 有时在提出问题之前先简化问题是件好事,但您必须确保可以根据实际问题调整答案。如果你过于简化你的问题,这是不可能的。
【解决方案2】:

您的 cmets 显示的输入与您的问题中显示的完全不同。您尝试解析的字符串是 HTML 字符串。不是带有空格分隔项的字符串。示例(摘自较长的文本):

<div><span class="watchlist " data-wkn="A1CSR6" title="Zur..." />

您正在搜索密钥 data-wkn 的重复项。

虽然使用正则表达式解析 HTML 通常不是一个好主意,但它可能适用于这种简单的场景。这个想法是搜索嵌入在data-wkn="" 之间的文本。这可以通过通用正则表达式模式(?&lt;=prefix)find(?=suffix) 来实现,该模式匹配prefixsuffix 之间的表达式(find)。

string key = Regex.Match(input, "(?<=data-wkn=\").*?(?=\")").Value;

请注意,我们必须在 C# 的字符串文字中使用 \" 转义双引号。

  • prefix = data-wkn=",键前的字符串(" 转义为 \")。
  • find = .*? 任意数量的任意字符,但尽可能少。
  • suffix = ",键后的字符串(" 转义为 \")。

用法:

var filteredList = numberList
   .GroupBy(s => Regex.Match(s, "(?<=data-wkn=\").*?(?=\")").Value)
   .Where(g => g.Count() == 1)
   .Select(g => g.First());

见:Regular Expression Language - Quick Reference

【讨论】:

  • 哇,真的很好,感谢您的宝贵时间:)
猜你喜欢
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 2012-09-28
  • 2018-06-09
相关资源
最近更新 更多