Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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#LINQ可空。其中内联空检查_C#_Linq - Fatal编程技术网

C#LINQ可空。其中内联空检查

C#LINQ可空。其中内联空检查,c#,linq,C#,Linq,我正在尝试做以下工作 List<JobPhase> jobPhases = new JobPhaseDao().findAll(); jobPhases.Remove(jobPhases.Where(m => m.Name.Contains("Pre")).First()); List jobPhases=new JobPhaseDao().findAll(); Remove(jobPhases.Where(m=>m.Name.Contains(“Pre”)).First()

我正在尝试做以下工作

List<JobPhase> jobPhases = new JobPhaseDao().findAll();
jobPhases.Remove(jobPhases.Where(m => m.Name.Contains("Pre")).First());
List jobPhases=new JobPhaseDao().findAll();
Remove(jobPhases.Where(m=>m.Name.Contains(“Pre”)).First());
这里有没有一种优雅的方法来执行内联空检查,这样如果列表找到任何匹配项,我就什么也不能删除

谢谢

列出作业阶段=新建作业阶段dao().findAll()
其中(m=>!m.Name.Contains(“Pre”);
似乎已经支持此行为:将
null
作为参数传递,它不应删除任何内容

若要避免调用
.Where
时出现异常,请使用
FirstOrDefault()
而不是
First()

请注意,如果您希望只有一项与
Where
谓词匹配,则应使用
SingleOrDefault
而不是
First

也就是说,还不完全清楚您要做什么:如果您有多个JobPhase的名称中包含“Pre”,那么您就有点武断地从列表中删除其中一个。您是否正在尝试删除所有匹配的JobPhase?如果是这样,您应该探索一种不同的方法,例如使用。例如:

List<JobPhase> jobPhases = new JobPhaseDao().findAll();
jobPhases.RemoveAll(jobPhases.Where(m => m.Name.Contains("Pre")));
List jobPhases=new JobPhaseDao().findAll();
RemoveAll(jobPhases.Where(m=>m.Name.Contains(“Pre”));

@bhamlin-取决于
findAll()
的返回类型。这并不能真正回答OP的问题-似乎需要“空检查”来防止对空集合调用
First()
。@Jakub-真的吗?假设我们不是在讨论一些定制的东西,那么.Net类型实现了什么
Where()
来返回一个列表?这也不会做一些事情。OP的示例仅删除名称以“Pre”开头的第一个jobPhase。这将删除所有这些内容。@bhamlin,findAll()返回什么并不重要,因为Where返回一个IEnumerable,而IEnumerable不能放入列表中。您确实需要一个.ToList()。您第一次是对的。只有当您要求Where调用返回不超过一个匹配项时,才应使用SingleOrDefault,并且您需要检查它是否没有。如果使用linq对对象调用SingleOrDefault,则要求枚举整个集合,以确认满足谓词的元素不超过一个。调用FirstOrDefault效率更高,因为一旦找到要返回的元素,就会停止迭代。
List<JobPhase> jobPhases = new JobPhaseDao().findAll();
jobPhases.RemoveAll(jobPhases.Where(m => m.Name.Contains("Pre")));