簡體   English   中英

從列表中刪除項目<string>其中子字符串重復(C#)

[英]Remove items from List<string> where substring is duplicated (C#)

假設我有一個清單

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

不幸的是,這不起作用,因為時間戳不同,但名稱相同

有人知道我可以在這里做什么嗎?

不要使用完整的字符串作為分組鍵,而是使用第一個空格的子字符串:

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

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

您的評論顯示的輸入與您的問題中顯示的完全不同。 您嘗試解析的字符串是 HTML 字符串。 不是帶有空格分隔項的字符串。 示例(摘自較長文本):

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

您正在搜索密鑰data-wkn重復項。

雖然用正則表達式解析 HTML 通常不是一個好主意,但它可能適用於這個簡單的場景。 這個想法是搜索嵌入在data-wkn=""之間的文本。 這可以通過通用正則表達式模式(?<=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());

請參閱: 正則表達式語言 - 快速參考

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM