Не могу понять ошибку в 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 шт):
Результатом 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: условие замены не трогал.