【问题标题】:List.Reverse() without any effect in C# [closed]List.Reverse() 在 C# 中没有任何效果 [关闭]
【发布时间】:2020-06-21 22:05:00
【问题描述】:

给定以下代码:

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

这是我的代码:

结果(在这之间,我根据泰森建议的命名约定重命名了变量)

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

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

【问题讨论】:

  • 应该以 a) 为新列表使用不同的名称和 b) 开头,遵循 C# 命名约定,这意味着变量应该以小写字母开头。做这两个应该消除关于您正在检查和/或反转哪个列表的任何歧义。
  • 您能否为该问题提供minimal reproducible example?一定很简单,但是在不知道上下文的情况下看几行代码有点猜谜游戏。
  • 我想看看隐藏在调试器窗口后面的代码。我猜你可能会倒车两次(Digits2 是什么)
  • 将代码添加为文本,还请添加this.Digits 的来源(您也可以显示Digit 的来源)。 input.Digits & this.Digits 是否可能链接到您的代码中的同一个列表?

标签: c# list reverse


【解决方案1】:

您发布的代码可以在真空中正常工作。 (除了,List&lt;&gt;.ToString() 在什么世界产生“{2,2,7}”?)

我的主要猜测是,正如 Lesiak 评论的那样,this.Digitsinput.Digits 指向完全相同的 List&lt;&gt; 实例。所以Digits1.Reverse() 颠倒了列表,Digits2.Reverse() 颠倒了颠倒,把它放回原来的样子。也许thisinput 是一回事。或者也许它们是碰巧使用相同底层Digits 列表的两个不同的东西。谁知道?

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

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

如果不进一步了解您的环境,确实不可能确定。

【讨论】:

    【解决方案2】:

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

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

    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&lt;&gt; 是一个可变类型。我不认为是这样。
    • string.Join( ", ", digits ) 会在这里为您节省几个 for 循环;)
    • @StriplingWarrior 两个列表,在 OP 显示的情况下,可以是同一个对象。我们需要更多信息。
    • @Icepickle 当然。你知道的又快又脏。至少你毫不怀疑它的作用。但是你总是可以编辑它并获得一些分数。
    猜你喜欢
    • 2011-01-20
    • 1970-01-01
    • 2018-06-14
    • 2019-06-19
    • 2017-07-18
    • 2010-10-17
    • 2012-11-25
    • 1970-01-01
    • 2019-08-13
    相关资源
    最近更新 更多