首先,不心疼,你沒有得到答案。我確切地知道這裏發生了什麼,如果有人問我這是幹什麼的話,我可能只是笑了起來,走開了。
有許多事情怎麼回事,但輸出開始:
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;
}
如果你手工做的數學你會得到正確的輸出信息。爲了節省大腦麻木的練習,我只會告訴你:它切換ASCII值的第5和第6位,將每個字符更改爲ASCII表格中的第5位。結果字符串是:
發送簡歷至[電子郵件地址]
Demostrative .NET小提琴:https://dotnetfiddle.net/x7UvYA
坦率地說,如果他們認爲這是一種能力的有效的測試,他們笑了起來。你真的想爲這些傢伙工作嗎? – spender 2014-08-29 00:29:19
我的答案是「.net Linq,它所做的是混淆了我的地獄,如果我的團隊中任何一個人寫了這個沒有有意義的評論,就會向團隊的其他成員購買一箱啤酒。在那裏有一些與BitShifting有關的事情「 – 2014-08-29 00:37:36
事實是,它不會做任何事情,直到你消耗IEnumerable ......但我懷疑他們正在尋找什麼。也許這就是你要找的東西?消費它,也許它成爲一個字符串? – SimpleVar 2014-08-29 00:44:32