根据另一个列表的开头删除列表的末尾

时间:2018-02-03 02:45:29

标签: c# list

我有两个清单:

var list1 = new List<int> { 0, 1, 2 };
var list2 = new List<int> { 1, 2, 3 };

我希望能够在list1的开头检查list2的结尾块是否存在。之后,我想删除任何列表中的一个块,将两者合并到第三个列表中(顺序地,list1 + list2)。

var list3 = list1.Something(list2); 
//Returns 0,1,2,3 instead of 0,1,2,1,2,3

还有另一个问题,一个列表可能比另一个列表小,例如:

0,1,2,3 <-- 2,3,4 = 0,1,2,3,4
5,6     <-- 6,7,8 = 5,6,7,8

当然,两个列表都可以不同:

0,1,2   <-- 5,6,7 = 0,1,2,5,6,7
[empty] <-- 1,2   = 1,2

.Net Framework是否提供了允许我这样做的方法?
如果没有,你能帮我创建吗?

结束和开始只能&#34;杀死&#34;如果它们顺序相等则相互依赖。 例如,如果list1以1,2结尾而list2以2,1开头则不相等。 因此,Distinct()无效。

我的用例:

private List<int> Cut(this List<int> first, List<int> second)
{
    //Code

    return new List<int>();
}

internal List<int> MergeKeyList()
{
    var keyList = new List<int>() {0, 1, 2};
    var newList = new List<int>() {1, 2, 3};

    return keyList.InsertRange(keyList.Count, keyList.Cut(newList));
}

2 个答案:

答案 0 :(得分:2)

使用for循环会更有效..但无论如何:

keyList.TakeWhile((_, i) => !keyList.Skip(i).SequenceEqual(newList.Take(keyList.Count - i)))
       .Concat(newList)

答案 1 :(得分:1)

试试这个:

void Main()
{
    var keyList = new List<int>() {0, 1, 2};
    var newList = new List<int>() {1, 2, 3};

    var result = keyList.Cut(newList);
}

public static class Ex
{
    public static List<int> Cut(this List<int> first, List<int> second)
    {
        var skip =
            second
                .Select((x, n) =>  new { x, n })
                .Where(xn => xn.x == first.Last())
                .Where(xn =>
                    first
                        .Skip(first.Count - xn.n - 1)
                        .SequenceEqual(second.Take(xn.n + 1)))
                .Reverse()
                .Select(xn => xn.n + 1)
                .FirstOrDefault();
        return first.Concat(second.Skip(skip)).ToList();
    }
}

result变为:

result

此外:

{ 0, 1, 2 } & { 1, 2, 1, 2, 3 } => { 0, 1, 2, 1, 2, 3 }
{ 0, 1, 2, 1 } & { 1, 2, 1, 2, 3 } => { 0, 1, 2, 1, 2, 3 }