处理Linq中的临时计算 [英] Handling temporary calculation in Linq
问题描述
在解决一个面试问题
问
一个六位数字需要找到在当它被2和9之间的整数相乘的方式给出了原始六位数字时,其数字被逆转。
示例:
假设我乘219978 * 4,我得到879912,反向879912时,我会得到219978回来。
Suppose I multiply 219978 * 4 i get 879912 ,when reverse 879912 I will get 219978 back.
我解决它使用
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);
}
}
}
原来的任务是使用LINQ来解决它。我在办理临时计算,例如一些混乱
The original task was to solve it using linq. I have bit confusion in handling temp calculations for example
当我在Enumerable.Range使用
when i use
var = from l in Enumerable.Range(100000,999999)
from i in Enumerable.Range(3,9)
什么是处理临时计算VAR一样NUM = l.ToString()的方式,在等混淆linq.It我很多来完成它Linq.Help表示赞赏。
What is the way to handle temporary calculations like var num = l.ToString(),etc in linq.It confused me a lot to finish it in Linq.Help is appreciated.
推荐答案
您想让
...
// 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);
}
与第一个答案(注意9的包含从您的原始代码的版本拍摄,但可能需要使用范围(3,8)
代替):
with first answer (note the inclusion of 9 is taken from your original version of the code, but it may be desirable to use Range(3,8)
instead):
109989 x 9 = 989901
优化的版本(和正确的范围内):
Optimised version (and correct range):
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 };
这减少了创建字符串数,使用整数平等,和正确地使用范围(第二个参数到范围
为计数,没有终点)。
This reduces the number of strings created, uses integer equality, and correctly uses the range (the second parameter to Range
is the count, not the end).
这篇关于处理Linq中的临时计算的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!