使用LINQ在一行代码中将string []转换为int []


273

我有一个字符串形式的整数数组:

var arr = new string[] { "1", "2", "3", "4" };

我需要一个“实”整数数组来进一步推它:

void Foo(int[] arr) { .. }

我试图转换int,但它当然失败了:

Foo(arr.Cast<int>.ToArray());

我可以下一步:

var list = new List<int>(arr.Length);
arr.ForEach(i => list.Add(Int32.Parse(i))); // maybe Convert.ToInt32() is better?
Foo(list.ToArray());

要么

var list = new List<int>(arr.Length);
arr.ForEach(i =>
{
   int j;
   if (Int32.TryParse(i, out j)) // TryParse is faster, yeah
   {
      list.Add(j);
   }
 }
 Foo(list.ToArray());

但两者看起来都很丑。

还有其他方法可以完成任务吗?


3
简单地遍历一个集合,转换值并将其添加到第二个集合有什么问题?对我来说似乎很清楚。
Ed S.


1
仅供参考,我在这里使用了这个问题:stackoverflow.com/questions/1297325/...
艾伦·赖斯


TryParse不会更快(除非您的字符串无效,但是在这种情况下,您希望异常向您发出警报)。
usr

Answers:


608

给定一个数组,您可以使用Array.ConvertAll方法

int[] myInts = Array.ConvertAll(arr, s => int.Parse(s));

感谢Marc Gravell指出可以省略lambda,从而产生如下所示的较短版本:

int[] myInts = Array.ConvertAll(arr, int.Parse);

LINQ解决方案与之类似,只是您需要额外的ToArray调用才能获得数组:

int[] myInts = arr.Select(int.Parse).ToArray();

4
真好 不知道那个。+1
支出者

生成的IL代码实际上少于Simon Fox的回答FWIW
艾伦·赖斯2009年

80
实际上,您不需要lambda。ConvertAll(arr, int.Parse)足够了
Marc Gravell

1
VB.Net 2010中需要Lambda:uArray = Array.ConvertAll(sNums.Split(“,”),Function(i)UInteger.Parse(i))
BSalita 2012年

1
@BSalita不,在VB.Net中Array.ConvertAll(arr, AddressOf Integer.Parse)
Slai

31

编辑:转换为数组

int[] asIntegers = arr.Select(s => int.Parse(s)).ToArray();

这应该可以解决问题:

var asIntegers = arr.Select(s => int.Parse(s));

1
.ToArray()必须满足OP的问题
花费者

2
将var更改为int []并附加.ToArray()(如果需要将其作为int数组使用)
Simon Fox,2009年

19

为了避免出现例外情况.Parse,这里有一些.TryParse替代方法。

要仅使用可以解析的元素:

string[] arr = { null, " ", " 1 ", " 002 ", "3.0" };
int i = 0; 
var a = (from s in arr where int.TryParse(s, out i) select i).ToArray();  // a = { 1, 2 }

要么

var a = arr.SelectMany(s => int.TryParse(s, out i) ? new[] { i } : new int[0]).ToArray();

0用于无法解析的元素的替代方法:

int i; 
var a = Array.ConvertAll(arr, s => int.TryParse(s, out i) ? i : 0); //a = { 0, 0, 1, 2, 0 }

要么

var a = arr.Select((s, i) => int.TryParse(s, out i) ? i : 0).ToArray();

C#7.0

var a = Array.ConvertAll(arr, s => int.TryParse(s, out var i) ? i : 0);

第二种解决方案:var a = Enumerable.Range(0, arr.Length).Where(i => int.TryParse(arr[i], out i)).ToArray();只返回指数0,1,2,...而不是实际值。什么是正确的解决方案?
Beetee

谢谢@Beetee。不知道我在想什么。我将其替换为另一种选择。
斯莱

@Slai:谢谢。但是是什么new int[0]呢?当我有文字时,我不会0在数组中出现……
Beetee

@Beetee new int[0]是一个空的int数组。前两个示例跳过了无法解析的值,后两个示例使用0了无法解析的值。
Slai

@Slai:啊,现在我明白了。我把它混在一起new int[] {0}。谢谢。
Beetee

12

您可以通过以下方式将字符串数组转换为int数组:

var converted = arr.Select(int.Parse)

5
真好!谢谢。而在VB.NetDim converted = arr.Select(addressof Integer.Parse)
马腹乔什-

3
var asIntegers = arr.Select(s => int.Parse(s)).ToArray(); 

必须确保您没有得到IEnumerable<int>回报


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.