转换分割字符串时出错

时间:2017-12-21 15:34:55

标签: c# linq

我有一个字符串,我从一个对象的属性中获取。我将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中添加什么来考虑空字符串的可能性?

2 个答案:

答案 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();

差异:

在你提出的问题中你说:问题是有时TheListOfStrings为空,我认为这是触发错误的原因

这不会是导致错误的原因,就好像您会收到NullReferenceException一样。

为了解决这个问题,你可以:

  1. 使用?.运算符(然后结果可能是null而不是空集合。
  2. 检查是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);