如何刪除列表中兩個相同的連續行之一? 例如:C#刪除列表中兩個連續且相同的行之一
load
testtest
cd /abc
cd /abc
testtest
exit
cd /abc
在這種情況下,只有一行三four.The名單有大約50000行,所以它也是關於速度。 你有想法嗎?
謝謝!
Homeros
如何刪除列表中兩個相同的連續行之一? 例如:C#刪除列表中兩個連續且相同的行之一
load
testtest
cd /abc
cd /abc
testtest
exit
cd /abc
在這種情況下,只有一行三four.The名單有大約50000行,所以它也是關於速度。 你有想法嗎?
謝謝!
Homeros
你只需要看看最後添加的元素在第二個列表:
var secondList = new List<string>(firstList.Count){ firstList[0] };
foreach(string next in firstList.Skip(1))
if(secondList.Last() != next)
secondList.Add(next);
由於你想刪除你必須將這個新列表分配給舊變量的副本:
firstList = secondList;
此方法比從列表中刪除更有效。
附註:由於Enumerable.Last
針對具有索引器(IList<T>
)的集合進行了優化,效率與secondList[secondList.Count-1]
一樣有效,但更具可讀性。
用戶的反向for循環並檢查相鄰的元件:
List<string> list = new List<string>();
for (int i = list.Count-1; i > 0 ; i--)
{
if (list[i] == list[i-1])
{
list.RemoveAt(i);
}
}
反向版本是有利的,在這裏,因爲該列表可能尺寸的縮小與每一個刪除的元素
我首先分割列表,然後使用LINQ來選擇不具有相同前一項的項目:
string[] source = text.Split(Environment.NewLine);
var list = source.Select((l, idx) => new { Line = l, Index = idx })
.Where(x => x.Index == 0 || source[x.Index - 1] != x.Line)
.Select(x => x.Line)
.ToList() // materialize
;
爲O(n)的擴展方法
然後用它
lines = lines.RemoveSameSuccessiveItems();
'if(item.Equals(previousItem)== false)'>'if(!item.Equals(previousItem))' –
也可以工作 - 但我更喜歡在否定條件下編寫== == false - 易於閱讀在頭部,然後是'!'前綴 – Fabio
你到目前爲止嘗試過什麼?想到最簡單的解決方案是使用for循環來檢查__nth__和__nth + 1__元素是否相同,然後刪除其中的一個。但是,您需要處理該列表的副本,因爲不允許迭代變更列表。你也可以使用LINQ。 – Asunez
50k根本不是很多。 – TaW