将逗号分隔的整数串转换为int数组

我只是find了一个相反的方法:创build一个逗号分隔的string从一个int列表或数组,而不是如何转换input像string str = "1,2,3,4,5"; 到一个数组或整数列表。

这是我的实现( 由Eric Lippert的这篇文章的启发):

  public static IEnumerable<int> StringToIntList(string str) { if (String.IsNullOrEmpty(str)) { yield break; } var chunks = str.Split(',').AsEnumerable(); using (var rator = chunks.GetEnumerator()) { while (rator.MoveNext()) { int i = 0; if (Int32.TryParse(rator.Current, out i)) { yield return i; } else { continue; } } } } 

你认为这是一个很好的方法,还是有一个更容易,甚至可以build立?

编辑:对不起,任何混淆,但方法需要处理像"1,2,,,3""###, 5,"等无效input跳过它。

你应该使用一个foreach循环,像这样:

 public static IEnumerable<int> StringToIntList(string str) { if (String.IsNullOrEmpty(str)) yield break; foreach(var s in str.Split(',')) { int num; if (int.TryParse(s, out num)) yield return num; } } 

请注意,像你原来的文章,这将忽略不能被parsing的数字。

如果你想抛出一个exception,如果一个数字不能被parsing,你可以更简单地使用LINQ:

 return (str ?? "").Split(',').Select<string, int>(int.Parse); 

如果你不想拥有当前的error handling行为,那真的很简单:

 return text.Split(',').Select(x => int.Parse(x)); 

否则,我会使用一个额外的辅助方法(如今天上午看到的!) :

 public static int? TryParseInt32(string text) { int value; return int.TryParse(text, out value) ? value : (int?) null; } 

和:

 return text.Split(',').Select<string, int?>(TryParseInt32) .Where(x => x.HasValue) .Select(x => x.Value); 

或者如果您不想使用方法组转换:

 return text.Split(',').Select(t => t.TryParseInt32(t) .Where(x => x.HasValue) .Select(x => x.Value); 

或以查询expressionforms:

 return from t in text.Split(',') select TryParseInt32(t) into x where x.HasValue select x.Value; 

没有使用lambda函数和有效的input只,我认为这是更清楚的:

 Array.ConvertAll<string, int>(value.Split(','), Convert.ToInt32); 

– EDIT–看起来我太过于直截了当地询问了他的问题标题 – 他要求提供一系列整数,而不是列表 – 资料完 –

又一个帮手的方法…

 private static int[] StringToIntArray(string myNumbers) { List<int> myIntegers = new List<int>(); Array.ForEach(myNumbers.Split(",".ToCharArray()), s => { int currentInt; if (Int32.TryParse(s, out currentInt)) myIntegers.Add(currentInt); }); return myIntegers.ToArray(); } 

快速testing代码呢,也…

 static void Main(string[] args) { string myNumbers = "1,2,3,4,5"; int[] myArray = StringToIntArray(myNumbers); Console.WriteLine(myArray.Sum().ToString()); // sum is 15. myNumbers = "1,2,3,4,5,6,bad"; myArray = StringToIntArray(myNumbers); Console.WriteLine(myArray.Sum().ToString()); // sum is 21 Console.ReadLine(); } 

这已经被问过。 .Net有一个内置的ConvertAll函数,用于将一个types的数组转换为另一个types的数组。 你可以把它和Split结合起来,把string分隔成一个string数组

function示例:

  static int[] ToIntArray(this string value, char separator) { return Array.ConvertAll(value.Split(separator), s=>int.Parse(s)); } 

从这里采取

这是很长的一段时间,但你可以很容易地修改它,以使用整数。

 private static long[] ConvertStringArrayToLongArray(string str) { return str.Split(",".ToCharArray()).Select(x => long.Parse(x.ToString())).ToArray(); } 

我不明白为什么拿出枚举器明确地提供了使用foreach任何优势。 也不需要在chunks上调用AsEnumerable

我觉得很好。 很明显,这很懒,所以它会很快(除了可能是第一个情况,当你拆分string)。

我喜欢一个简单的解决scheme,为我工作。

String.Join(",",str.Split(','));