use*_*560 4 c# linq-to-objects
在解决面试问题时
问题 当数字乘以2到9之间的整数时,需要以这种方式找到一个六位数字,当数字反转时给出原始的六位数字.
例:
假设我乘以219978*4我得到879912,当反向879912我将得到219978回来.
我用它解决了
for (long l = 100000; l < 999999; l++)
{
var num = l.ToString();
for (int i = 3; i < 9; i++)
{
var mul = l * i;
string str = mul.ToString();
char[] splitDigits = str.ToCharArray();
string reversedDigit =
new string(splitDigits.Reverse().ToArray());
if (reversedDigit.CompareTo(num) == 0)
{
Console.WriteLine("{0} * {1}= {2},
when multiplied {3} ", num, i, mul,reversedDigit);
}
}
}
Run Code Online (Sandbox Code Playgroud)
最初的任务是使用linq解决它.例如,我在处理临时计算时有点困惑
当我使用
var = from l in Enumerable.Range(100000,999999)
from i in Enumerable.Range(3,9)
Run Code Online (Sandbox Code Playgroud)
什么是在linq中处理像var num = l.ToString()等临时计算的方法.在Linq中我很困惑我完成它.感谢帮助.
你想let......
// NOTE: buggy; see below
var qry = from l in Enumerable.Range(100000, 999999)
from i in Enumerable.Range(3, 9)
let s = l.ToString()
let t = (l * i).ToString()
where s.Reverse().SequenceEqual(t)
select new { l, i };
var a = qry.First();
Console.WriteLine("an answer...");
Console.WriteLine("{0} x {1} = {2}", a.l, a.i, a.l * a.i);
Console.WriteLine("all answers...");
foreach (var row in qry)
{
Console.WriteLine("{0} x {1} = {2}", row.l, row.i, row.l * row.i);
}
Run Code Online (Sandbox Code Playgroud)
第一个答案(注意包含 9是从您的原始版本的代码,但可能需要使用Range(3,8)):
109989 x 9 = 989901
Run Code Online (Sandbox Code Playgroud)
优化版本(和正确的范围):
var qry = from l in Enumerable.Range(100000, 999999 - 100000)
let s = l.ToString()
let sReversed = new string(s.Reverse().ToArray())
let wanted = int.Parse(sReversed)
from i in Enumerable.Range(3, 8 - 3)
where l * i == wanted
select new { l, i };
Run Code Online (Sandbox Code Playgroud)
这减少了创建的字符串数量,使用整数相等,并正确使用范围(第二个参数Range是计数,而不是结束).