.NET查询得到不正确的答案

本文关键字:答案 不正确 查询 NET | 更新日期: 2023-09-27 18:19:51

我参加了招聘会,有人问我一个问题"这个查询是做什么的,用的是哪种语言"。

我告诉过它在.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]

.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]

当您运行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%.$@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表中的一个字符。结果字符串为:

将简历发送至[电子邮件地址]

令人沮丧的.NET难题:https://dotnetfiddle.net/x7UvYA

对于字符串中的每个字符,通过将其与(3左移5)异或来投影该字符,然后将数值强制转换回char。

您可以通过对一个未编码的字符串再次运行查询来生成自己的代码字符串,因为如果您用相同的值对一个数字进行两次异或,那么您将得到与开始时相同的数字。(例如x ^ y ^ y = x

我将把它作为一个练习留给读者来弄清楚以下是什么:

4()3@)3@!@$5-"@4%34

我想它测试的是:

  • Linq到对象
  • 理解IEnumerable<T>接口及其与字符串的关系
  • 铸造
  • 逐位操作
  • 逐位运算符优先级

就我个人而言,我认为这是一个无用的测试,并不能真正反映现实世界的问题。