使用以下代码将字符串拆分为List< int>,但有时字符串包含非整数值,处理方式不同。
示例字符串可能类似于:1,2,3,4,x
代码如下:
List<int> arrCMs = new List<int>(strMyList.Split(',').Select(x => int.Parse(x)));
问题是,只要它碰到了&#39; x&#39;它会引发错误,因为&#39; x&#39;不能解析为整数。
如何让它忽略非整数值?我确信我应该能够使用int.TryParse做一些事情,但无法弄明白。
由于
答案 0 :(得分:12)
List<int> arrCMs = strMyList.Split(',')
.Select(possibleIntegerAsString => {
int parsedInteger = 0;
bool isInteger = int.TryParse(possibleIntegerAsString , out parsedInteger);
return new {isInteger, parsedInteger};
})
.Where(tryParseResult => tryParseResult.isInteger)
.Select(tryParseResult => tryParseResult.parsedInteger)
.ToList();
上面示例中的第一个Select
返回一个anonymous type,它描述了int.TryParse
的结果 - 也就是说,它是否是一个有效的整数,如果是,那么该值是什么
Where
子句筛选出那些无效的子句。
第二个Select
然后从可以解析的字符串中检索解析的值。
答案 1 :(得分:6)
简短而甜蜜,使用int.TryParse
:
List<int> nums = list
.Split(',')
.Select(i =>
{
int val;
return int.TryParse(i, out val) ? (int?)val : null;
})
.Where(i => i.HasValue)
.Cast<int>()
.ToList()
答案 2 :(得分:0)
更改此
int result;
List<int> arrCMs =
new List<int>(strMyList.Split(',')
.Where(x => int.TryParse(x, out result))
.Select(int.Parse));
答案 3 :(得分:0)
另一个,使用Array.ForEach
List<int> ints = new List<int>();
Array.ForEach(strMyList.Split(','), s =>
{
int i;
if (int.TryParse(s, out i)){ ints.Add(i);}
});
答案 4 :(得分:0)
情节扭曲:使用旧式foreach
循环。
List<int> arrCMs = new List<int>();
foreach (string str in strMyList.Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
int res;
if (int.TryParse(str, out res))
{
arrCMs.Add(res);
}
}
你也可以为它创建一个方法,并使用yield return
来使用迭代器块:
public static IEnumerable<int> ParseIntegers(string val, char seperator = ',')
{
foreach (string str in val.Split(new [] { seperator }, StringSplitOptions.RemoveEmptyEntries))
{
int res;
if (int.TryParse(str, out res))
{
yield return res;
}
}
}
如果只是一次性使用,这可能是过度工程化的。
答案 5 :(得分:-1)
仅为每个值解析一次,但有点棘手。
int result = 0;
List<int> arrCMs = strMyList.Split(',')
.Where(x => int.TryParse(x, out result))
.Select(x => result)
.ToList();