我试图创建一个程序,找到数组中相等元素的最大序列。例如:
输入: 2,1,1,2,3,3, 2,2,2 ,1
结果: 2,2,2
using System;
using System.Collections.Generic;
class MaximalSequence
{
static void Main()
{
string[] array = Console.ReadLine().Split(new[] { ", " }, StringSplitOptions.None);
string previous = string.Empty;
List<string> sequence = new List<string>();
List<string> tempSequence = new List<string>();
for (int i = 0; i < array.Length; i++)
{
if (array[i] != previous)
{
tempSequence.Add(previous);
if (tempSequence.Count > sequence.Count)
{
sequence = tempSequence;
}
tempSequence.Clear();
}
else
{
tempSequence.Add(previous);
}
previous = array[i];
}
Console.WriteLine(string.Join(", ", sequence));
}
}
问题是由于某种原因tempSequence.Clear();
两个列表都被清除了。
答案 0 :(得分:1)
正如其他人所指出的那样,List
是一种引用类型,因此赋值通过引用分配。这意味着两个变量都在更改相同的底层对象(因此.Clear
清除两个列表)。
解决方案是制作具有相同内容的单独对象(也称为深拷贝)。 List
提供了一个构造函数public List(IEnumerable<T> collection)
,用于复制另一个集合(List
)中的元素。
在您的代码中,将sequence = tempSequence;
替换为
sequence = new List<string>(tempSequence);
请参阅此.NET Fiddle
答案 1 :(得分:0)
这是因为你将tempSequence分配给序列:
sequence = tempSequence
在c#中,对象通过引用传递。清除tempSequence后,清除序列。
答案 2 :(得分:0)
sequence = tempSequence
使序列与tempSequence相同,因此对其中一个所做的每个更改也适用于另一个。