最大递增序列

Maximal increasing sequence

我试图编写一个程序来查找数组中相等元素的最大序列。例如:

输入: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(); 两个列表都被清除了。

那是因为你将 tempSequence 赋给了序列:

sequence = tempSequence

在 C# 中,对象通过引用传递。当您清除 tempSequence 时,您将清除序列。

sequence = tempSequence 使序列成为与 tempSequence 相同的对象,因此对其中一个所做的每个更改也适用于另一个。

正如其他人所指出的,List 是一种引用类型,因此赋值是通过引用进行的。这意味着两个变量都在更改相同的底层对象(因此 .Clear 清除了两个列表)。

解决方案是制作一个具有相同内容的单独对象(也称为深拷贝)。 List 提供了一个构造函数 public List(IEnumerable<T> collection),它从另一个集合 (List) 复制元素。

在您的代码中,将 sequence = tempSequence; 替换为

sequence = new List<string>(tempSequence);

看到这个.NET Fiddle