我试图将这个foreach循环移动到linq:
compData = componentData[0];
foreach (var componentTraceData in componentData)
{
if (!string.IsNullOrEmpty(componentTraceData.CompName))
{
compData = componentTraceData;
break;
}
}
这就是我的尝试:
var tt = (from n in componentData
where !string.IsNullOrEmpty(n.CompName)
select n).FirstOrDefault();
如果linq没有找到任何结果,我如何能够componentData[0]
?
答案 0 :(得分:11)
选择您当前拥有的行,并在结尾处添加?? componentData[0]
。
??
是空合并运算符。这只是简写,“如果我左边的内容为null,则返回我右边的内容。如果它不为null,则返回。”
答案 1 :(得分:6)
您可以使用Enumerable.DefaultIfEmpty
并指定自定义默认值:
var result = componentData.Where(n => !string.IsNullOrEmpty(n.CompName))
.DefaultIfEmpty(componentData.ElementAtOrDefault(0))
.First();
请注意,您现在可以安全地使用First
,因为序列不能再为空。如果源序列为空,ElementAtOrDefault
将返回default(T)
(对于引用类型为null)。当您直接使用IList<T>
的索引器时,这将阻止异常。
答案 2 :(得分:2)
var tt = componentData.FirstOrDefault(n=!string.IsNullOrEmpty(n.CompName)) ?? componentData[0];
虽然您希望检查componentData
是否为空,count
/ length
也是大于零。