将逗号分隔的整数串转换为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(','));