2014-08-29 69 views
1

我在招聘會上,我被問了一個問題:「請問這個查詢做,其中的語言是」。.NET查詢獲取不當答案

我說,這是在.NET的LINQ,但無法預測它做什麼。

任何一個都可以幫我

我寫在.NET中,並嘗試過。

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] 
+4

坦率地說,如果他們認爲這是一種能力的有效的測試,他們笑了起來。你真的想爲這些傢伙工作嗎? – spender 2014-08-29 00:29:19

+0

我的答案是「.net Linq,它所做的是混淆了我的地獄,如果我的團隊中任何一個人寫了這個沒有有意義的評論,就會向團隊的其他成員購買一箱啤酒。在那裏有一些與BitShifting有關的事情「 – 2014-08-29 00:37:36

+0

事實是,它不會做任何事情,直到你消耗IEnumerable ......但我懷疑他們正在尋找什麼。也許這就是你要找的東西?消費它,也許它成爲一個字符串? – SimpleVar 2014-08-29 00:44:32

回答

2

對於字符串中的每個字符,項目由字符異或與(左3 5移動),然後投數值回一個字符。

您可以通過在未編碼字符串再次運行查詢,生成自己的代碼串,因爲如果你用相同的值XOR A的號碼,你會留下您開始使用相同的號碼。 (如x^y^y = x

我會離開它作爲一個練習讀者找出以下的是:

4()[email protected])[email protected][email protected]$5-"@4%34 

我想它測試:

  • LINQ到對象
  • 瞭解IEnumerable<T>界面及其與字符串的關係
  • 鑄造
  • 個運算
  • 位運算符的優先級

就個人而言,我覺得這是一個無用的測試並沒有真正反映現實世界的問題。

12

首先,不心疼,你沒有得到答案。我確切地知道這裏發生了什麼,如果有人問我這是幹什麼的話,我可能只是笑了起來,走開了。

有許多事情怎麼回事,但輸出開始:

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

+4

如果我只是想讓我變成dotnetfiddle – 2014-08-29 00:56:22

+0

我喜歡他們的特技如何反彈,並使一堆SOer遠離他們的公司。 – Aron 2014-08-29 01:19:44

+0

meh。回想起來,他們的噱頭的目的實際上可能是讓你回家併爲自己運行代碼,而不是實際坐在那裏參加招聘會並找出答案。如果不在那裏,我認爲在不知情的情況下嘲笑他們可能不公平。 – 2014-08-29 02:37:30