绕过 Lambda 语法中 int.TryParse 的 else 块

Rah*_*ngh 3 c# linq arrays lambda

假设我有一个字符串数组,它可能包含一些可以解析为integer.

string[] strnums = { "2", "3", "hello", "5", "6", "8" };
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 LINQ 方法将此字符串数组转换为整数数组Select,如下所示:-

int[] numbers = strnums.Select(x =>
                {
                    int temp = 0;
                    return int.TryParse(x, out temp) ? temp : 0;
                }).ToArray();
Run Code Online (Sandbox Code Playgroud)

Output:2,3, 0 ,5,6,8 //这里不要0

在这里,在 else 块中,int.TryParse我必须给出默认值(0),但我不需要这个,这就是为什么我将我的问题标题为“绕过”else 部分。

然后我使用了这个查询,这工作正常,意味着如果未解析字符串,它不会插入不必要的零:-

int[] numbers1 = strnums.Select(x => 
                {
                    int temp = 0;
                    bool isParsed = int.TryParse(x, out temp);
                    return new { temp, isParsed };
                })
                .Where(x => x.isParsed)
                .Select(x => x.temp)
                .ToArray();
Run Code Online (Sandbox Code Playgroud)

但是,这似乎是很多代码,只是为了不考虑默认值,我进行投影、过滤并再次投影。这是正确的方法吗?

小智 5

为什么不以良好的老式方式实现 - 至少它很容易理解

        var nums = new List<int>();
        var numStrings = new List<string>{ "1", "2", "hello" };
        numStrings.ForEach(numString =>
        {
            int temp;
            if (int.TryParse(numString, out temp))
                nums.Add(temp);
        });
Run Code Online (Sandbox Code Playgroud)

你可以省点万金油!!!