如何在C#中通过引用传递

时间:2019-05-17 12:42:04

标签: c# pass-by-value

我正在写一个快速排序类,模仿Sedgewick在“算法4”中给出的代码。原始代码是用Java编写的。我用C#翻译了核心部分,但似乎没有用。看来问题出在model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape)) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(num_classes, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='Adadelta', metrics=['accuracy']) 行中,但我不知道如何解决。

我试图在a = a.OrderBy(x => r.Next()).ToArray()ref方法签名中添加Sort,但是一旦我在Partition中调用函数Sort(ref a),编译器就会抱怨说Main。 我还尝试使第一个cannot converte ref System.String[] to ref System.IComparable[]返回一个Sort,即已排序的数组。但是,当我在IComparable[]这样的Main中调用它时,会抛出运行时错误,提示string[] nums = (string[]) Sort(nums)

Unable to cast object of type 'System.IComparable[]' to type 'System.String[]'.

seconde WriteLine应该打印出排序后的数组,但不是。

2 个答案:

答案 0 :(得分:2)

这里的问题不是通过引用传递的,而是您确定的这一行:

a = a.OrderBy(x => r.Next()).ToArray();

您要赋予a一个新值,这与仅修改a的内容不同。由于Sort方法对数组进行了适当的排序,因此您不应该创建新的数组,并且不必在对数组进行排序之前对其进行重新排序。

因此,删除这两行应该可以使您的代码正常工作

Random r = new Random();
a = a.OrderBy(x => r.Next()).ToArray();

当您尝试从Sort返回数组时,您似乎遇到了一些问题。您可以通过将所有方法都设为通用,并将通用参数T限制为IComparable<T>来解决此问题:

public static T[] Sort<T>(T[] a) where T: IComparable<T>
{
    Random r = new Random();
    a = a.OrderBy(x => r.Next()).ToArray();
    Sort(a, 0, a.Length - 1);
    return a;
}

private static void Sort<T>(T[] a, int lo, int hi) where T: IComparable<T>
{
    if (lo >= hi) return;
    int p = Partition(a, lo, hi);
    Sort(a, lo, p - 1);
    Sort(a, p + 1, hi);
}

private static int Partition<T>(T[] a, int lo, int hi) where T: IComparable<T>
{
    int i = lo, j = hi;
    T p = a[lo];
    while (true)
    {
        while (Less(a[++i], p))
        {
            if (i == hi)
                break;
        }

        while (Less(p, a[--j]))
        {
            if (j == lo)
                break;
        }

        if (i >= j) break;

        Exch(a, i, j);
    }
    Exch(a, lo, j);
    return j;
}

private static void Exch<T>(T[] a, int lo, int hi)
{
    T tmp = a[lo];
    a[lo] = a[hi];
    a[hi] = tmp;
}

private static bool Less<T>(T a, T b) where T: IComparable<T>
{
    return a.CompareTo(b) < 0;
}

答案 1 :(得分:0)

您需要返回排序后的数组,因为就像您所说的那样,它是通过值而不是通过引用传递的。 将返回类型而不是void添加到Sort方法中,并返回a;

然后改变

排序(数字);

nums =排序(nums);