2017-07-14 34 views
-2

如何刪除列表中兩個相同的連續行之一? 例如:C#刪除列表中兩個連續且相同的行之一

load 
testtest 
cd /abc 
cd /abc 
testtest 
exit 
cd /abc 

在這種情況下,只有一行三four.The名單有大約50000行,所以它也是關於速度。 你有想法嗎?

謝謝!

Homeros

+0

你到目前爲止嘗試過什麼?想到最簡單的解決方案是使用for循環來檢查__nth__和__nth + 1__元素是否相同,然後刪除其中的一個。但是,您需要處理該列表的副本,因爲不允許迭代變更列表。你也可以使用LINQ。 – Asunez

+0

50k根本不是很多。 – TaW

回答

0

你只需要看看最後添加的元素在第二個列表:

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]一樣有效,但更具可讀性。

0

用戶的反向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); 
    } 
} 

反向版本是有利的,在這裏,因爲該列表可能尺寸的縮小與每一個刪除的元素

0

我首先分割列表,然後使用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 
       ; 
0

爲O(n)的擴展方法

​​

然後用它

lines = lines.RemoveSameSuccessiveItems(); 
+0

'if(item.Equals(previousItem)== false)'>'if(!item.Equals(previousItem))' –

+0

也可以工作 - 但我更喜歡在否定條件下編寫== == false - 易於閱讀在頭部,然後是'!'前綴 – Fabio

相關問題