Передача массива в метод делегирования как ref

Я попытался решить эту задачу HackerRank и нашел алгоритм C++ с помощью @DNKpp опубликовал здесь. Это рабочая версия С#:

class Demo
{
    delegate int MyDelegate(int[] _scores, int _aScore);

    static int[] climbingLeaderboard(int[] scores, int[] alice)
    {
        int[] result = new int[alice.Count()];

        var distinctScores = scores.Distinct().ToArray();

        MyDelegate locateRanking = (scoresArr, aliceScore) => {
            var itr = Array.Find(scoresArr, el => el <= aliceScore);
            var idx = Array.FindIndex(scoresArr, score => score == itr);
            return idx == -1 ? distinctScores.Count() + 1 : idx + 1;
        };

        for (int i = 0; i < alice.Count(); i++)
        {
            result[i] = locateRanking(distinctScores, alice[i]);
        }
        return result;
    }



    static void Main(string[] args)
    {
        int[] scores = { 100, 90, 90, 80, 75, 60 };
        int[] alice = { 50, 65, 77, 90, 102 };
        int[] result = new int[alice.Count()];

        result = climbingLeaderboard(scores, alice);
    }
}

Сигнатура функции climbingLeaderboard исправлена.
Но я хотел бы передать scores как ref в locateRanking. Является ли это возможным? Я получаю сообщение об ошибке. Кроме того, эта версия C # достигает тайм-аута на HackerRank. Как я могу улучшить его?


person user2376997    schedule 27.11.2018    source источник
comment
...Я получаю сообщение об ошибке... - эта информация не очень полезна. В нем не сказано, что именно не сработало, т. е. получали ли вы где-либо сообщения об ошибках, пытались ли вы отладить проблему, чтобы убедиться, что она действительно делает то, что задумано.   -  person Jazb    schedule 27.11.2018
comment
Массив является ссылочным типом, поэтому вы уже передаете на него ссылку. Не вижу особого смысла передавать ссылку на ссылку. Это то, что вы хотите? Кроме того, здесь нет кода, который мог бы истечь по тайм-ауту. Вы имеете в виду, что программа работает слишком долго?   -  person John Wu    schedule 27.11.2018
comment
Какую пользу даст вам передача его как ref? И вы не можете изменить сигнатуру метода, изменив делегат.   -  person Llama    schedule 27.11.2018
comment
Где находится метод locateRanking?   -  person Access Denied    schedule 27.11.2018
comment
@Джон Ву, принято. Я неправильно понял массив в С#.   -  person user2376997    schedule 27.11.2018
comment
Он не проходит 4 из 11 тестовых случаев из-за тайм-аута.   -  person user2376997    schedule 27.11.2018


Ответы (1)


Вы пробовали это? (Я добавил ключевое слово ref в делегат и функцию):

class Demo
{
    delegate int MyDelegate(ref int[] _scores, int _aScore);

    static int[] climbingLeaderboard(int[] scores, int[] alice)
    {
        int[] result = new int[alice.Count()];

        var distinctScores = scores.Distinct().ToArray();

        MyDelegate locateRanking = (ref int[] scoresArr, int aliceScore) => {
            var itr = Array.Find(scoresArr, el => el <= aliceScore);
            var idx = Array.FindIndex(scoresArr, score => score == itr);
            return idx == -1 ? distinctScores.Count() + 1 : idx + 1;
        };

        for (int i = 0; i < alice.Count(); i++)
        {
            result[i] = locateRanking(ref distinctScores, alice[i]);
        }
        return result;
    }



    static void Main(string[] args)
    {
        int[] scores = { 100, 90, 90, 80, 75, 60 };
        int[] alice = { 50, 65, 77, 90, 102 };
        int[] result = new int[alice.Count()];

        result = climbingLeaderboard(scores, alice);
    }
}
person mendy    schedule 27.11.2018
comment
Это тоже работает, но после комментариев @John Wu я полагаю, что это больше не нужно. тайм-аут еще есть - person user2376997; 27.11.2018
comment
Извините, новичок здесь (активно), jsut видел, что вы сказали, что сигнатура функции должна оставаться фиксированной.. означает ли это, что использование ключевого слова ref считается другой сигнатурой - person mendy; 27.11.2018
comment
Фиксируется только подпись climbingLeaderboard. MyDelegate можно изменить - person user2376997; 27.11.2018