Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Lambda语法中int.TryParse的旁路else块_C#_Arrays_Linq_Lambda - Fatal编程技术网

C# Lambda语法中int.TryParse的旁路else块

C# Lambda语法中int.TryParse的旁路else块,c#,arrays,linq,lambda,C#,Arrays,Linq,Lambda,假设我有一个字符串数组,它可能包含一些可以解析为整数的数据 string[] strnums = { "2", "3", "hello", "5", "6", "8" }; 我正在尝试使用LINQSelect方法将此字符串数组转换为整数数组,如下所示:- int[] numbers = strnums.Select(x => { int temp = 0; return int

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

string[] strnums = { "2", "3", "hello", "5", "6", "8" };
我正在尝试使用LINQ
Select
方法将此字符串数组转换为整数数组,如下所示:-

int[] numbers = strnums.Select(x =>
                {
                    int temp = 0;
                    return int.TryParse(x, out temp) ? temp : 0;
                }).ToArray();
输出:
2,3,0,5,6,8//此处不需要0

这里,在
int.TryParse
的else块中,我必须给出一个默认值(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();

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

我认为您的代码看起来不错,可读性很好。对于失败的解析结果,可以考虑使用可空INT,然后过滤掉:

    int[] numbers = strnums.Select(x =>
    {
        int temp = 0;
        return int.TryParse(x, out temp) ? (int?)temp : (int?)null;
    })
    .Where(i => i != null)
    .Select(i => i.Value)
    .ToArray();

使用
null
值表示可空值是表示缺少值的传统内置方式。另外,在非常紧密的循环中,这避免了分配匿名类的内存压力。

您可以使用
SelectMany

int[] ints = strnums.SelectMany(s =>
            {
                int i;
                return int.TryParse(s, out i) ? new[] { i } : new int[0];
            }).ToArray();

我要说的是,你的第二个例子对于解决你的问题来说已经足够了

与其他答案不同,它实际上明确表示您只需要可以解析的值。所有其他的解决方案,虽然聪明,却混淆了这一事实。我发现第二个示例是一个更好的解决方案的主要原因是
isParsed
字段,尤其是与
结合使用时。其中(x=>x.isParsed)
。这就清楚地表明,您只需要成功解析的值。任何第一次阅读代码的人都会立即想到“只获取解析过的值”。此外,代码中没有歧义


另外,我不同意第二个例子不好,因为它更长。您应该更多地关注代码的自我描述方式,而不是哪一个更短。这是新开发人员的错误想法之一。他们认为,如果他们能产生更短的代码,他们就是更好的开发人员,他们就是更好的开发人员。虽然代码高尔夫是一门有趣的学科,但大多数人不希望在生产环境中看到这样的代码。

为什么不以一种好的旧方式实现呢?至少它很容易理解

        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);
        });
var nums=new List();
var numStrings=新列表{“1”、“2”、“hello”};
numStrings.ForEach(numString=>
{
内部温度;
if(内部温度(数值串,外部温度))
添加数值(温度);
});
你可以省下一些老虎膏

int-re;
int re;

List<Installer> installers_list = db.Installers.ToList().Where(a => 
int.TryParse(a.Install_Date, out re) == true && int.Parse(a.Install_Date) >= StartDate && 
int.Parse(a.Install_Date) <= EndDate).ToList();
List installers\u List=db.installers.ToList()。其中(a=> int.TryParse(a.Install\u Date,out re)=true和int.Parse(a.Install\u Date)>=开始日期和
int.Parse(a.Install_Date)我认为它在一般情况下是有意义的,因为Linq将投影和筛选视为单独的、连续的操作。我倾向于使用可为null的int来实现这一点,但您的里程数可能会有所不同。我认为第二个示例没有任何问题。它是有意义的,实际上明确地描述了您想要的内容,而不是“聪明"这就是我要做的,除非我可以将选择器提取到一个可重用的函数中。这实际上与问题的方法相同:
Nullable
几乎是问题的匿名类,我认为
isParsed
重命名为
HasValue
,而
temp
重命名为
Value
@hvd-true这个问题中的方法是好的。但是对于迭代一些非常小的东西,比如整数,这避免了为每次迭代分配匿名类型的内存压力。我以前就被这个问题困扰过,所以我倾向于避免它。当然,这通常是无关紧要的,但在紧循环中可以产生可测量的差异。但是像我一样说,这就是我要做的,我并不是说你应该改变这一部分。:)就我个人而言,如果一个内置类型和一个用户定义的类型一样适合我的需要,那就足够让我选择内置类型了。可读性可能是内置类型的匹配性较差的原因之一,但是
null
作为表示“我们没有任何
int
值”的值已经得到了很好的证明,所以对我来说它看起来不错。呃。。。Lee和dbc给出的另外两个答案(无论如何都没有删除),对我来说都很清楚代码的意图。您发现他们有什么不清楚的地方?@hvd但他们不清楚程序员的意图。dbc’d与问题中的几乎相同,Lee’s需要一分钟的时间在事先不知道问题的情况下找出发生了什么。我想问的不是你是否觉得Lee的答案更难理解,而是它让你更难理解。我这样问是因为我看不到它,它对我来说似乎非常清楚。@hvd首先,看我的编辑。其次,Lee的答案是使用SelectMany,我发现经验较少的开发人员对它的理解要少得多。此外,它还使用一个值数组和空数组来表示OP的示例使用的是匿名且正确命名的类。另一方面,使用长度为零和一的数组可以避免返回一个值来表示没有任何值可返回的事实,这被一些人(不一定是我)视为反模式。Lee的方法使用一个匿名函数,该函数返回零整数表示无法从字符串中获取整数,并返回一个整数表示可以从字符串中获取一个整数。这可能不值得进行大讨论,但我希望您能同意,虽然您的观点是有效的,但它不是唯一有效的观点。虽然这可能会回答这个问题,但您应该将您的答案包括在内,并解释此代码块如何回答