如何删除列表中两个相同连续行中的一行? 例如:
load
testtest
cd /abc
cd /abc
testtest
exit
cd /abc
在这种情况下,只有三行或四行。列表有大约50000行,所以它也与速度有关。 你有什么想法吗?
谢谢!
Homeros
答案 0 :(得分: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);
}
}
反向版本在这里是有利的,因为列表可能会随着每个被删除的元素缩小
答案 1 :(得分: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
;
答案 2 :(得分:0)
O(n)作为扩展方法
public static IEnumerable<string> RemoveSameSuccessiveItems(this IEnumerable<string> items)
{
string previousItem = null;
foreach(var item in list)
{
if (item.Equals(previousItem) == false)
{
previousItem = item;
yield item;
}
}
}
然后使用它
lines = lines.RemoveSameSuccessiveItems();
答案 3 :(得分: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]
一样高,但更具可读性。