我有一个包含数字的字符串。
string sNumbers = "1,2,3,4,5";
我可以将它分割然后转换为List<int>
。sNumbers.Split( new[] { ',' } ).ToList<int>();
我该如何将字符串数组转换为整数列表?
这样我就能将string[]
转换为IEnumerable
了。
我有一个包含数字的字符串。
string sNumbers = "1,2,3,4,5";
我可以将它分割然后转换为List<int>
。sNumbers.Split( new[] { ',' } ).ToList<int>();
我该如何将字符串数组转换为整数列表?
这样我就能将string[]
转换为IEnumerable
了。
var numbers = sNumbers?.Split(',')?.Select(Int32.Parse)?.ToList();
从C#的最新版本(v6+)开始,你可以使用空值条件运算符来进行内联的空值检查。
最好使用 int.TryParse
来避免异常;
var numbers = sNumbers
.Split(',')
.Where(x => int.TryParse(x, out _))
.Select(int.Parse)
.ToList();
你也可以这样做,而不需要使用 Linq:
List<int> numbers = new List<int>( Array.ConvertAll(sNumbers.Split(','), int.Parse) );
// Uses Linq
var numbers = Array.ConvertAll(sNumbers.Split(','), int.Parse).ToList();
Joze的方法也需要使用LINQ,ToList()
位于System.Linq
命名空间中。
您可以通过将数组传递给List构造函数来将数组转换为列表,而无需使用Linq:
List<int> numbers = new List<int>( Array.ConvertAll(sNumbers.Split(','), int.Parse) );
也可以直接将整数数组分配给变量。
像这样:
int[] numbers = sNumbers.Split(',').Select(Int32.Parse).ToArray();
你可以使用新的C# 6.0语言特性:
Convert.ToInt32
替换委托(s) => { return Convert.ToInt32(s); }
Convert.ToInt32
替换冗余的构造函数调用:new Converter<string, int>(Convert.ToInt32)
结果将是:
var intList = new List<int>(Array.ConvertAll(sNumbers.Split(','), Convert.ToInt32));
您也可以使用该扩展方法。
public static List<int> SplitToIntList(this string list, char separator = ',')
{
return list.Split(separator).Select(Int32.Parse).ToList();
}
使用方法:
var numberListString = "1, 2, 3, 4";
List<int> numberList = numberListString.SplitToIntList(',');
int.Parse
不起作用。所以我使用下面的方法。List<int> intList = new List<int>( Array.ConvertAll(sNumbers.Split(','),
new Converter<string, int>((s)=>{return Convert.ToInt32(s);}) ) );
我的问题类似,但有时字符串包含字母(有时为空)。
string sNumbers = "1,2,hh,3,4,x,5";
尝试遵循 Pcode Xonos 扩展方法:
public static List<int> SplitToIntList(this string list, char separator = ',')
{
int result = 0;
return (from s in list.Split(',')
let isint = int.TryParse(s, out result)
let val = result
where isint
select val).ToList();
}
既然我们有泛型,为什么还要坚持使用 int 类型呢? 不如考虑像这样的扩展方法:
public static List<T> Split<T>(this string @this, char separator, out bool AllConverted)
{
List<T> returnVals = new List<T>();
AllConverted = true;
var itens = @this.Split(separator);
foreach (var item in itens)
{
try
{
returnVals.Add((T)Convert.ChangeType(item, typeof(T)));
}
catch { AllConverted = false; }
}
return returnVals;
}
然后
string testString = "1, 2, 3, XP, *, 6";
List<int> splited = testString.Split<int>(',', out _);