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为您处理,代码看起来还是更整洁,可读性更强。