C#删除列表中两个连续和相同的行之一

时间:2017-07-14 07:43:54

标签: c# list

如何删除列表中两个相同连续行中的一行? 例如:

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

在这种情况下,只有三行或四行。列表有大约50000行,所以它也与速度有关。 你有什么想法吗?

谢谢!

Homeros

4 个答案:

答案 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]一样高,但更具可读性。