Как заставить функцию возвращать индекс и значение массива? - PullRequest
0 голосов
/ 03 июня 2018

Эта функция подсчитывает, как часто буква встречается в данной строке, и помещает ее в массив (индекс - это число-число букв, а значение - подсчитанные вхождения).Теперь мне нужно вернуть и букву (что она уже делает) и значение.Просто читая онлайн, я не мог понять, как использовать ref и альтернативы для этого.

static char MostCommonLetter(string s)
    {
        int[] occurrances = new int[255];
        for (int i = 0; i < s.Length; i++)
        {
            if (char.IsLetter(s[i]))
            {
                int ascii = (int)s[i];
                occurrances[ascii]++;
            }
        }
        char maxValue = (char)Array.IndexOf(occurrances, occurrances.Max());
        return maxValue;
    }

Ответы [ 4 ]

0 голосов
/ 03 июня 2018

Лучший и гибкий способ сделать то, что вам нужно в C #, это использовать struct .

Определить структуру таким образом и использовать ее для одновременного возврата нескольких результатов (структура может даже содержать функцию ... вы можете видеть эти структуры как более легкие классы):

namespace YourApp.AnyNamespace {

    // Other things

    public struct SampleName
    {
        public char mostCommon;
        public int occurancies;
    }
}
0 голосов
/ 03 июня 2018

Вы можете использовать параметр «out» для возврата дополнительных параметров из функции.

    static char MostCommonLetter(string s, out int maxOccurrance)
    {
        int[] occurrances = new int[255];
        for (int i = 0; i < s.Length; i++)
        {
            if (char.IsLetter(s[i]))
            {
                int ascii = (int)s[i];
                occurrances[ascii]++;
            }
        }

        maxOccurrance = occurrances.Max();
        char maxValue = (char)Array.IndexOf(occurrances, maxOccurrance);

        return maxValue;
    }

    //...

    // In C# 7 and above you can call it like that
    var c = MostCommonLetter("abccd", out int maxOccurrance);

    //// In older version of C# you should just declare out variable before use it
    //int maxOccurrance;
    //var c = MostCommonLetter("abccd", out maxOccurrance);
0 голосов
/ 03 июня 2018

Альтернативным решением будет использование LINQ:

string str = "Hello World!";

var result = str.GroupBy(c => c)
                .Select(group => new { Letter = group.Key, Count = group.Count() })
                .OrderByDescending(x => x.Count)
                .First();

char letter = result.Letter;
int count = result.Count; 

letter = 'l'

count = 3

0 голосов
/ 03 июня 2018

В C # 7 и выше Value Tuples - ваш лучший выбор.Вы можете определить свою функцию следующим образом:

static (char letter, int occurrences) MostCommonLetter(string s)
{
    int[] occurrences = new int[255];
    for (int i = 0; i < s.Length; i++)
    {
        if (char.IsLetter(s[i]))
        {
            int ascii = (int)s[i];
            occurrances[ascii]++;
        }
    }
    char letter = (char)Array.IndexOf(occurrences, occurrences.Max());
    return (index: letter, occurrences: occurrences);
}

Затем вы можете ссылаться на вывод следующим образом:

var (index, occurrences) = MostCommonLetter(yourString);
...