LINQ使用字符串上的Select返回奇怪的值

时间:2014-06-12 07:56:56

标签: c# linq

此代码返回int 49

IEnumerable<int> numbersList = numbers.Select(x => Convert.ToInt32(x));

int sum = numbersList.Sum();

数字变量是一个值为1的字符串。

如果我使用

numbers.Split(',').Select(x => Convert.ToInt32(x));

然后我得到了正确答案。我知道split传回一个字符串数组所以我使用了一个单值为1的字符串数组而不是分裂,这也是有用的。

string[] sa = new string[] { "1" }

我的问题是,是否有人知道为什么在字符串上使用select会返回错误的值?

感谢。

4 个答案:

答案 0 :(得分:8)

当您使用numbers.Select()时,您将字符串视为集合。它是一个集合,但不是子串的集合,而是一组字符。

您得到的结果与numbers是一个字符数组相同,即{ '1' }

Convert.ToInt32('1')的结果是'1'的字符代码,即49。

答案 1 :(得分:2)

代码返回数字1的ASCII代码:

http://www.asciitable.com/index/asciifull.gif

答案 2 :(得分:2)

第一种方法转换char&#39; 1&#39;到一个int,第二个转换字符串&#34; 1&#34;到一个int。第一个将返回49(该字符的ascii值),第二个将返回1.

您可以使用以下代码将表示int的char转换为int:

c - '0'

答案 3 :(得分:1)

在第一个示例中,lambda表达式中的x是Unicode字符。 Convert.ToInt32将指定的Unicode字符的值转换为等效的32位有符号整数。在你的情况下,这是49。

在第二种情况下,x是一个字符串。 Convert.ToInt32的工作方式不同,字符串将此字符串中包含的数字转换为实际的int表示形式,在本例中为1。

http://msdn.microsoft.com/pl-pl/library/ww9t2871(v=vs.110).aspx

http://msdn.microsoft.com/pl-pl/library/sf1aw27b(v=vs.110).aspx