我参加了职业博览会,我被问到一个问题"这个查询做了什么以及它是用哪种语言"。
我告诉它是在.NET LINQ中,但无法预测它的作用。
任何人都可以帮助我
我在.NET中写道并尝试过。
var youShould = from c
in "3%.$@9/52@2%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]
答案 0 :(得分:12)
首先,不要觉得你没有得到答案。我确切地知道这里发生了什么,如果有人问我这是做什么的话,我可能只是笑了笑然后走开了。
这里有很多事情要做,但从输出开始:
var youShould = from c in "3%.$@9/52@2%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()
)时,您获得的是一种特殊的内部类型的对象,称为&#34; iterator&#34;,特别是,实现IEnumerable
接口的对象。 .NET在整个地方使用这些对象;例如,foreach
循环的目的是迭代迭代器。
要了解这类物品最重要的事情之一就是创造一个实际上不会做的事情#34;做&#34;任何东西。迭代器实际上并不包含一组东西;相反,它包含生成一组事物所需的指令。如果您尝试执行类似的操作,例如: ToString
就此而言,您获胜的结果非常有用。
然而,它告诉我们一件事:它告诉我们这个特定的迭代器采用类型char
的源列表并返回一个新的集合,类型char
。 (我知道,因为我知道&#34;选择迭代器&#34;的两个通用参数是什么。)为了从这个迭代器中获得实际结果,你只需要以某种方式循环它,例如:
foreach (var c in youShould)
{
myLabel.Text += c;
}
或者,稍微容易一些,
myLabel.Text = new string(youShould.ToArray());
要真正弄清楚它的作用,你还必须认识到第二个事实:LINQ将字符串视为&#34;字符集&#34;。它将处理该字符串中的每个字符,一次一个,并对该值执行逐位操作。
该查询的长形等价物是这样的:
var input= "3%.$@9/52@2%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表中的一个字符。结果字符串是:
将您的简历发送至[电子邮件地址]
Demostrative .NET Fiddle:https://dotnetfiddle.net/x7UvYA
答案 1 :(得分:2)
对于字符串中的每个字符,通过将字符与x左右进行投影(3左移5次),然后将数值转换回字符。
您可以通过在未编码的字符串上再次运行查询来生成您自己的代码字符串,因为如果您使用相同的值对某个数字进行两次异或,则您将保留与您开始时相同的数字。 (例如x ^ y ^ y = x
)
我将它作为练习留给读者,以弄清楚以下内容:
4()3@)3@!@$5-"@4%34
我想测试一下:
IEnumerable<T>
界面及其与字符串的关系就个人而言,我认为这是一项无用的测试,并不能真正反映现实世界的问题。