小编典典

如果字符串可解析为int,则选择解析的int

c#

所以我有一个IEnumerable<string>可以包含可以解析为的值,也可以包含不能解析的int值。

如您所知,Int32.Parse如果无法将字符串更改为int,则会引发异常,而while
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成功(返回布尔值)。然后,在投影中,我实际上是在执行解析。感觉很难看。

这是使用LINQ在一行中过滤可分析值的最佳方法吗?


阅读 300

收藏
2020-05-19

共1个答案

小编典典

在查询语法中很难做到这一点,但在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?

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;
2020-05-19