为了在我的代码中简洁起见,我希望能够执行以下操作:拥有一个集合,找到与 lambda 表达式匹配的第一个元素;如果存在,则返回属性或函数的值。如果不存在,则返回null。
更新了示例 w。类
让我们收集一些东西
class Stuff
{
public int Id { get; set; }
public string Value { get; set; }
public DateTime? ExecutionTime { get; set; }
}
我的目标是在调用此函数时找到一种很好的返回方式
var list = new Stuff[] { new Stuff() { Id = 1, Value = "label", ExecutionTime = DateTime.Now } };
// would return the value of ExecutionTime for the element in the list
var ExistingTime = list.FirstOrDefault(s => s.Value.Contains("ab")).ExecutionTime;
// would return null
var NotExistingTime = list.FirstOrDefault(s => s.Value.Contains("zzz")).ExecutionTime;
是否可以使用某些 linq-syntax-fu 或者我必须在继续之前明确检查返回值?
原始示例与.字符串
var stuff = {"I", "am", "many", "strings", "obviously"};
// would return "OBVIOUSLY"
var UpperValueOfAString = stuff.FirstOrDefault(s => s.contains("bvi")).ToUpper();
// would return null
var UpperValueOfAStringWannabe = stuff.FirstOrDefault(s => s.contains("unknown token")).ToUpper();
评论:
我不应该在原来的示例中使用字符串,因为它通过将问题集中在 ToUpper 方法和字符串类上而稍微扭曲了问题。请考虑更新的示例
为什么不直接做:
stuff.Where(s => s.contains("bvi"))
.Select(s => s.ToUpper())
.FirstOrDefault()
如果您有“非默认默认值”,您可以执行以下操作:
stuff.Where(s => s.contains("bvi"))
.Select(s => s.ToUpper())
.DefaultIfEmpty("Something Else")
.First()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)