Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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# 我可以在forEach中包含空详细信息检查吗?_C#_Asp.net_Asp.net Web Api - Fatal编程技术网

C# 我可以在forEach中包含空详细信息检查吗?

C# 我可以在forEach中包含空详细信息检查吗?,c#,asp.net,asp.net-web-api,C#,Asp.net,Asp.net Web Api,我有以下代码: foreach (var result in results) { if (result.definition != null) { WordForm wordForm = db.WordForms .Where(w => w.Definition == result.definit

我有以下代码:

         foreach (var result in results)
            {
                if (result.definition != null)
                {
                    WordForm wordForm = db.WordForms
                        .Where(w => w.Definition == result.definition)
                        .FirstOrDefault();

                    if (wordForm == null)
                    {
                        wordForm = addWordForm(result, word);
                    }

                    addWordFormExamples(result, word, wordForm);
                    addWordFormSynonyms(result, word, wordForm);

                    db.SaveChanges();

                }
            }
有没有一种方法可以使用.forEach来优化它,还可以通过添加一个检查来查看作为实际.forEach的一部分的定义是否为null?我希望清理这段代码,并尽我所能进一步简化它

请注意,我已经将其移动到私有方法:

    private void processWordForm(Word word, Result result)
    {
        WordForm wordForm = db.WordForms
                                    .Where(w => w.Definition == result.definition)
                                    .FirstOrDefault();

        if (wordForm == null)
        {
            wordForm = addWordForm(result, word);
        }

        addWordFormExamples(result, word, wordForm);
        addWordFormSynonyms(result, word, wordForm);

        db.SaveChanges();
    }

所以现在我只需要一个更简洁的方法来调用这个方法,如果有方法的话。

在执行
foreach
循环之前,你会得到所有的结果,在循环内部,你会检查每个是否包含一个非空的定义。这意味着你实际上只对包含定义

您可以通过修改将
results
对象设置为仅包含具有定义的结果的查询来稍微重新计算代码。这将消除在
foreach
循环中进行
null
检查的需要

类似这样的内容:

var results = sourceOfData.Where(i => e.definition != null).ToList();

foreach (var result in results)
{
        WordForm wordForm = db.WordForms
            .Where(w => w.Definition == result.definition)
            .FirstOrDefault();

        if (wordForm == null)
        {
            wordForm = addWordForm(result, word);
        }

        addWordFormExamples(result, word, wordForm);
        addWordFormSynonyms(result, word, wordForm);

        db.SaveChanges();
}

当询问优化代码时,我不认为使用Where方法可以为您做到这一点。它本身使用循环过滤掉它不需要的东西,导致与问题中的代码相比,此代码的执行速度较慢。优化在哪里?LINQ to对象执行线性遍历。LINQ to Entities将代码转换为SQL WHERE。她的问题中有db.SaveChanges(),因此我假设她正在对实体执行LINQ to Entities,因此我的答案实际上应该优化代码。但即使没有优化代码,通过删除空检查并让LINQ为您处理,代码看起来还是更整洁,可读性更强。