[英]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)
來實現,該模式匹配prefix
和suffix
之間的表達式 ( 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.