我有一个字符串,我从一个对象的属性中获取。我将IT拆分为一个字符串列表,然后我想将其转换为一个整数列表。
这就是代码的样子:
public IQueryable<School> GetSchools(string state = "", string county = "")
{
return _mapper.Map<List<School>>(_adapter.GetSchools(state, county)).AsQueryable();
}
我收到错误
输入字符串的格式不正确。
问题是有时TheListOfInts = s.TheListOfStrings
.Split(',')
.ToList()
.Select(g => Convert.ToInt32(g))
.ToList();
是; null;我认为这是触发错误的原因。我可以在lambda中添加什么来考虑空字符串的可能性?
答案 0 :(得分:2)
将字符串解析为int时,您希望使用int.TryParse
来确保它不会引发异常。在linq你可以这样做:
var result = s.TheListOfStrings.Split(',')
.Select(i => (int.TryParse(i, out var value), value))
.Where(pair => pair.Item1) // remove items that failed to be parsed
.Select(pair => pair.value) // take the parsed value
.ToList();
这修复了分割中空项的情况(您仍然可以添加RemoveEmptyEntries
标志),并且,如果项不是有效整数,它将不会解析它。
请注意,您添加的第一个ToList()
不需要。
当您使用pre C#7.0版本时,您应该:
int value;
var result = s.TheListOfStrings.Split(',')
.Select(i => new { Succeeded = int.TryParse(i, out value), Value = value })
.Where(pair => pair.Succeeded) // remove items that failed to be parsed
.Select(pair => pair.Value) // take the parsed value
.ToList();
差异:
out var
在你提出的问题中你说:问题是有时TheListOfStrings
为空,我认为这是触发错误的原因。
这不会是导致错误的原因,就好像您会收到NullReferenceException
一样。
为了解决这个问题,你可以:
?.
运算符(然后结果可能是null
而不是空集合。检查是null
:
var result = s.TheListOfStrings == null ?
Enumerable.Empty<int> () :
/*The linq query above*/;
答案 1 :(得分:1)
int x;
var TheListOfInts = s.TheListOfStrings.Split(',').Select(g => Int32.TryParse(g, out x) ? x : 0).ToList();
使用tryparse,并捕获g是否为有效整数,如果不是,则可以设置默认值。 (我把默认值设为0);