在Linq处理临时计算(Handling temporary calculation in Linq)

在解决面试问题时

问题 当乘以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); } } }

最初的任务是使用linq解决它。 例如,我在处理临时计算时有点困惑

当我使用

var = from l in Enumerable.Range(100000,999999) from i in Enumerable.Range(3,9)

什么是在linq中处理像var num = l.ToString()等临时计算的方法。在Linq中我很困惑我完成它。感谢帮助。

When solving an interview question

Question A six digit number need to be found in such a manner when it is multiplied by an integer between 2 and 9 gives the original six digit number when its digits are reversed.

Example:

Suppose I multiply 219978 * 4 i get 879912 ,when reverse 879912 I will get 219978 back.

I solved it using

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); } } }

The original task was to solve it using linq. I have bit confusion in handling temp calculations for example

when i use

var = from l in Enumerable.Range(100000,999999) from i in Enumerable.Range(3,9)

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是从您的原始版本的代码中获取,但可能需要使用Range(3,8)代替):

109989 x 9 = 989901

优化版本(和正确的范围):

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 };

这减少了创建的字符串数量,使用整数相等,并正确使用范围( Range的第二个参数是计数 ,而不是结束)。

You want 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); }

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处理临时计算(Handling temporary calculation in Linq)

在解决面试问题时

问题 当乘以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); } } }

最初的任务是使用linq解决它。 例如,我在处理临时计算时有点困惑

当我使用

var = from l in Enumerable.Range(100000,999999) from i in Enumerable.Range(3,9)

什么是在linq中处理像var num = l.ToString()等临时计算的方法。在Linq中我很困惑我完成它。感谢帮助。

When solving an interview question

Question A six digit number need to be found in such a manner when it is multiplied by an integer between 2 and 9 gives the original six digit number when its digits are reversed.

Example:

Suppose I multiply 219978 * 4 i get 879912 ,when reverse 879912 I will get 219978 back.

I solved it using

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); } } }

The original task was to solve it using linq. I have bit confusion in handling temp calculations for example

when i use

var = from l in Enumerable.Range(100000,999999) from i in Enumerable.Range(3,9)

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是从您的原始版本的代码中获取,但可能需要使用Range(3,8)代替):

109989 x 9 = 989901

优化版本(和正确的范围):

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 };

这减少了创建的字符串数量,使用整数相等,并正确使用范围( Range的第二个参数是计数 ,而不是结束)。

You want 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); }

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