Не могу понять ошибку в linq запросе c#

Мне нужно сделать так, чтобы результатом выполнения linq-запроса был массив слов, в которых буквы заменены на другие. Должен быть такой результат: "zab" "zab" (т.е. в этом случае каждый символ должен быть заменен на предыдущий).

Код:

string input = "abc abc";
string alphabet = "abcdefghijklmnopqrstuvwxyz";

var text = input.Split(' ').Select(scramWord => scramWord.Select(scramLetter =>
{
    if(!Char.IsLetter(scramLetter)) return scramLetter;
                                                          
    int letterIndex = alphabet.IndexOf(scramLetter) - 1;
    if(letterIndex < 0) return alphabet[letterIndex + alphabet.Length];
    return alphabet[letterIndex]; 
}));

Что не так с этим кодом и почему он выдает такой результат: System.Linq.Enumerable+SelectEnumerableIterator`2[System.Char,System.Char] System.Linq.Enumerable+SelectEnumerableIterator`2[System.Char,System.Char] ?


Ответы (1 шт):

Автор решения: Vasek

Результатом Select будет IEnumerable<TResult> где TResult определяется через выражение. Если сделать селект внутри селекта, то результатом будет IEnumerable<IEnumerable<TResult>>. В даном слукчаем результат будет IEnumerable<IEnumerable<char>>. Второе выражение можно для понимания заменить на метод:

const string input = "abc abc";
const string alphabet = "abcdefghijklmnopqrstuvwxyz";

public static void Main(string[] args)
{
    var text = input.Split(' ').Select(scramWord => SelectChars(scramWord));   
}

private static IEnumerable<char> SelectChars(string word)
{
    return word.Select(scramLetter => {
        if(!Char.IsLetter(scramLetter))
            return scramLetter;

        int letterIndex = alphabet.IndexOf(scramLetter) - 1;
        if(letterIndex < 0)
            return alphabet[letterIndex + alphabet.Length];

        return alphabet[letterIndex];
    });
}

Соответственно, что бы получить желаемый результат, нужно результат вложенного селекта объединить в строку(через String.Concat), а результат первого превратит в массив(через ToArray):

var text = input.Split(' ').Select(scramWord => String.Concat(SelectChars(scramWord))).ToArray()

PS: условие замены не трогал.

→ Ссылка