C# 根据另一个列表的开头删除列表的结尾
我有两份清单:C# 根据另一个列表的开头删除列表的结尾,c#,list,C#,List,我有两份清单: var list1 = new List<int> { 0, 1, 2 }; var list2 = new List<int> { 1, 2, 3 }; 还有一个问题,一个列表可能比另一个列表小,例如: 0,1,2,3 <-- 2,3,4 = 0,1,2,3,4 5,6 <-- 6,7,8 = 5,6,7,8 试试这个: void Main() { var keyList = new List<int>() {
var list1 = new List<int> { 0, 1, 2 };
var list2 = new List<int> { 1, 2, 3 };
还有一个问题,一个列表可能比另一个列表小,例如:
0,1,2,3 <-- 2,3,4 = 0,1,2,3,4
5,6 <-- 6,7,8 = 5,6,7,8
试试这个:
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();
}
}
试试这个:
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();
}
}
对于循环,使用
将更加有效。。但不管怎样:
keyList.TakeWhile((_, i) => !keyList.Skip(i).SequenceEqual(newList.Take(keyList.Count - i)))
.Concat(newList)
对于
循环,使用将更加有效。。但不管怎样:
keyList.TakeWhile((_, i) => !keyList.Skip(i).SequenceEqual(newList.Take(keyList.Count - i)))
.Concat(newList)
你试过什么?您认为您至少可以发布完成此操作所需的基本代码吗?为什么msdn不向您建议?@Enigmativity我仍在尝试:/那很好,让我们看看你试过什么。此外,您认为您至少可以发布执行此操作所需的框架代码吗?此外,您的描述“两个列表的并集在一个列表的末尾和另一个列表的开头之间没有任何重复值”似乎过于笼统。我假设如果你从1,2,1
和2,1,3
开始,你想要1,2,1,3
?你尝试了什么?您认为您至少可以发布完成此操作所需的基本代码吗?为什么msdn不向您建议?@Enigmativity我仍在尝试:/那很好,让我们看看你试过什么。此外,您认为您至少可以发布执行此操作所需的框架代码吗?此外,您的描述“两个列表的并集在一个列表的末尾和另一个列表的开头之间没有任何重复值”似乎过于笼统。我假设如果你从1,2,1
和2,1,3
开始,你想要1,2,1,3
?就是这样。我只需要处理空列表。谢谢。:)就这样。我只需要处理空列表。谢谢。:)适用于空列表。非常聪明!比我的答案好多了。@Slai恭喜你的代码圆滑!(顺便说一句,如果其中一个列表为空,则第二个示例不起作用,它返回空列表)啊,是的,因为zip不会比较计数。我会恢复到原来的状态。通过避免使用,它可能会稍微短一点
,或更多LinqWorks处理空列表。非常聪明!比我的答案好多了。@Slai恭喜你的代码圆滑!(顺便说一句,如果其中一个列表为空,则第二个示例不起作用,它返回空列表)啊,是的,因为zip不会比较计数。我会恢复到原来的状态。通过避免使用,它可能会稍微短一点代码>,或MoreLINQ
{ 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 }
keyList.TakeWhile((_, i) => !keyList.Skip(i).SequenceEqual(newList.Take(keyList.Count - i)))
.Concat(newList)