Прежде всего, не чувствуйте себя плохо, что вы не получили ответа. Я точно знаю, что здесь происходит, и я бы, наверное, просто рассмеялся и ушел, если кто-то спросил меня, что это сделал.
Там есть ряд вещей, происходящих здесь, но начать с выходом:
var youShould = from c in "3%[email protected]/[email protected]%35-%@4/@./3,!#+%23 !2#526%N#/-"
select (char)(c^3 << 5);
Label1.Text = youShould.ToString();
>>> System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Char,System.Char]
При выполнении запроса LINQ, или использовать любого из эквивалентных методов, таких как Select()
, которые возвращают наборы, что вы получите обратно является особым внутренним типом объекта, называемым «итератором», в частности, объектом, реализующим интерфейс IEnumerable
. .NET использует эти объекты повсюду; например, целью цикла foreach
является итерация по итераторам.
Одна из самых важных вещей, которые нужно знать об этих объектах, состоит в том, что просто создание одного на самом деле ничего не делает. Итератор фактически не содержит множество вещей; скорее, он содержит инструкции, необходимые для произвести набор вещей. Если вы попытаетесь сделать что-то вроде, например, ToString
, результат, полученный вами, не будет очень полезен.
Однако, это говорит нам одно: он сообщает нам, что этот конкретный итератор принимает исходный список типа char
и возвращает новый набор, также типа char
. (Я знаю, потому что я знаю, что это то, что две общие параметры «выберите итератора» делать.) Для того, чтобы получить реальные результаты из этого итератора вам просто нужно перебрать это как-то, например:
foreach (var c in youShould)
{
myLabel.Text += c;
}
или , немного легче,
myLabel.Text = new string(youShould.ToArray());
на самом деле выяснить, что он делает, вы должны также признать, второй факт: LINQ обрабатывает строку как «набор символов». Он будет обрабатывать каждый символ в этой строке, по одному за раз, и выполнять побитовые операции над значением.
Длинная форма эквивалент этого запроса что-то вроде этого:
var input= "3%[email protected]/[email protected]%35-%@4/@./3,!#+%23 !2#526%N#/-";
var output = string.Empty;
foreach (var c in input)
{
var i = (int)c;
var i2 = i^(3 << 5);
var c2= (char)i2;
output += c2;
}
Если вы сделали математику вручную вы получите правильное сообщение вывода. Чтобы сэкономить вам упражнение на ошеломление мозга, я просто скажу вам: он переключает биты 5 и 6 значения ASCII, меняя каждый символ на один дальше по таблице ASCII. Полученная строка:
SEND ваше резюме [адрес электронной почты]
.NET Скрипки демонстрационные: https://dotnetfiddle.net/x7UvYA
Честно говоря, если они думают, что это достоверный тест способности, они смеясь. Вы действительно хотите работать на этих парней? – spender
Ответом будет «.net Linq, и то, что он делает, путает меня от меня, и если кто-нибудь из моей команды написал это без значимого комментария, он будет покупать остальную часть команды в случае пива. есть что-то делать с BitShifting там » –
Истина заключается в том, что она ничего не делает, пока вы не потребляете« IEnumerable »... Но я сомневаюсь, что это то, что они искали. Может, это то, что вы искали? Потреблять его и, возможно, превращать его в строку? – SimpleVar