【问题标题】:can sort some arrays but not others?可以对一些数组进行排序但不能对其他数组进行排序?
【发布时间】:2014-05-08 00:58:05
【问题描述】:

我正在按字母倒序对文本框的行进行排序,并且我的代码运行良好:

string[] temp = textBox.Lines;
Array.Sort(temp);
Array.Reverse(temp);
textBox.Lines = temp;

但我很困惑为什么 Visual Studio 不允许我这样做:

Array.Sort(textBox.Lines);
Array.Reverse(textBox.Lines);

由于我还是新手,所以我主要是想弄清楚 C# 的微妙之处。

编辑:第二个 sn-p 不会出错,但它不会执行任何代码(即似乎没有做任何事情)。

【问题讨论】:

  • 让你做这些事情......
  • 当你尝试第二个 sn-p 时会发生什么?
  • 查看文档中的注释:msdn.microsoft.com/en-us/library/…
  • 你想在这里达到什么目的?
  • 对于您的编辑,您说它不执行任何代码,但它确实执行代码。问题只是再次读取行不会导致行排序。 是您遇到的问题,这实际上与您所说的问题相反。

标签: c# arrays sorting


【解决方案1】:

下面是 TextBox.Lines 的几行 getter:

public string[] Lines
{ 
    get
    { 
        string text = Text;
        ArrayList list = new ArrayList();

        ...
        ...

        return(string[]) list.ToArray(typeof(string));
    }

您将获得一个新集合,其中包含来自TextBox 的数据的副本。您实际上并未对TextBox 中的数据进行排序。

void Array.Sort 对从该属性传回的数组进行排序后,原来的TextBox 保持不变。

【讨论】:

  • 其他答案也是正确的,但您的答案最清楚。谢谢!
【解决方案2】:

确实,您的数组将被排序和反转,但不会分配给TextBox。修改 Lines 数组没有任何效果,因为它是计算属性。

您需要将其分配给Lines属性才能看到效果。

这里是source的参考

【讨论】:

    【解决方案3】:

    这是因为 textBox.Lines 没有作为类的成员变量公开,而是作为属性公开。在幕后,一个属性实际上是两种方法,例如get_Lines 和 set_Lines。关于从 get_Lines 返回的数组,您所知道的只是它是一个字符串数组。无法保证该属性由实际数组支持——也许 TextBox 在内部将文本保留为一个大字符串,然后当您调用 get_Lines 时它会为您分解成碎片。因此,当您对 get_Lines 的结果调用 Sort() 和 Reverse() 时,不一定要修改内部列表。

    【讨论】:

    • 为什么这很重要?你肯定可以将属性getter的结果传递给Array.SortArray.Reverse。如果它是一个值类型,它将改变一个副本,但数组不是值类型,它们是引用类型,并且数组在这里被改变,而不是构造一个新的数组。
    • 这与我在回答中引用的原因有关,自第一次发布以来我已经对此进行了扩展。很好奇为什么这会遭到反对。
    • 因为您发布了一个不正确的答案,然后在稍后的某个时间点对其进行了编辑,所以它被否决了。如果您从一开始就发布了正确的答案,那就不会发生了。
    • +1 我必须承认,当我阅读您的第一个答案时,我对 Servy 也有类似的反应。您的更新澄清并几乎确定了它。
    • Servy,我发布的内容是正确的。我只添加了文本,没有删除或更改我写的任何内容。所有额外的文字都解释了为什么你的评论是错误的。
    猜你喜欢
    • 2021-10-15
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多