List.Reverse() 在 C# 中没有任何效果

List.Reverse() without any effect in C#

给定以下代码:

List<Digit> tempDigits = input.Digits;
string test = tempDigits.ToString(); // -> {2,2,7}
tempDigits.Reverse();
string test2 = tempDigits.ToString(); // -> {2,2,7}

这是我的代码:

结果(在两者之间,我根据 Thiessen 建议的命名约定重命名了变量)

出于某种原因,反向 soes 似乎没有发挥作用。

这一定很简单。但我不知道问题是什么。希望有人能帮帮忙。

您提供的信息不完整,无法解决该问题。

您提供的信息中的可重现示例未显示相同的症状。

using System;
using System.Collections.Generic;
                    
public class Program
{
    public static void Main()
    {
        List<int> digits = new List<int> {2,2,7};
        foreach(int digit in digits)
            Console.Write(digit);
        Console.WriteLine();
        
        digits.Reverse();
        foreach(int digit in digits)
            Console.Write(digit);
        Console.WriteLine();
    }
}

这给出了预期的输出

227
722

https://dotnetfiddle.net/Hs9H0k

我的猜测是,this.Digits 不是可变引用。但这只是一个假设。

您发布的代码在真空中可以正常工作。 (除了,List<>.ToString() 在哪个世界产生“{2,2,7}”?)

我的主要猜测是,正如 Lesiak 评论的那样,this.Digitsinput.Digits 指向完全相同的 List<> 实例。所以 Digits1.Reverse() 反转列表,Digits2.Reverse() 反转反转,将其放回原处。也许 thisinput 是同一回事。或者它们可能是碰巧使用相同的底层 Digits 列表的两个不同的东西。谁知道?

还有很多其他的可能性,其中一些是根据所提供的信息无法猜测的。例如:

  • 也许为您提供该列表的 input 控件正在尝试主动管理该列表,并在它发现它被反转后立即重新排序。
  • 也许您没有使用 System.Collections.Generic.List<> 类型,而是引用了其他名称空间,其中有人编写了一个 List<> 类型,但其行为与您想象的不一样将。也许它甚至没有实现 Reverse(),所以编译器正在使用 Enumerable.Reverse() 扩展方法,它不会改变底层数据。

如果不进一步了解您的环境,就无法确定。