所以我有一个IEnumerable<string>可以包含可以解析为的值,也可以包含不能解析的int值。
IEnumerable<string>
int
如您所知,Int32.Parse如果无法将字符串更改为int,则会引发异常,而while Int32.TryParse可用于检查并查看是否可以在不处理异常的情况下进行转换。
Int32.Parse
Int32.TryParse
因此,我想使用LINQ查询单行解析那些可以解析为int的字符串,而不会在过程中引发异常。我有一个解决方案,但希望社区提供有关这是否是最佳方法的建议。
这是我所拥有的:
int asInt = 0; var ints = from str in strings where Int32.TryParse(str, out asInt) select Int32.Parse(str);
正如您所看到的,我将其asInt用作对的调用的临时空间TryParse,目的只是为了确定是否TryParse成功(返回布尔值)。然后,在投影中,我实际上是在执行解析。感觉很难看。
asInt
TryParse
这是使用LINQ在一行中过滤可分析值的最佳方法吗?
在查询语法中很难做到这一点,但在lambda语法中还不错:
var ints = strings.Select(str => { int value; bool success = int.TryParse(str, out value); return new { value, success }; }) .Where(pair => pair.success) .Select(pair => pair.value);
另外,您可能会发现值得编写一个返回的方法int?:
int?
public static int? NullableTryParseInt32(string text) { int value; return int.TryParse(text, out value) ? (int?) value : null; }
然后,您可以使用:
var ints = from str in strings let nullable = NullableTryParseInt32(str) where nullable != null select nullable.Value;