现在,我有以下代码:
List<MyType> objectList = MyType.GetList();
MyType objectInstance = new MyType();
if (objectList.Exists(o => o.MyProperty == "SomeValue"))
{
objectInstance = objectList.First(o => o.MyProperty == "SomeValue"));
DoStuff();
}
else if (objectList.Exists(o => o.MyProperty == "SomeOtherValue"))
{
objectInstance = objectList.First(o => o.MyProperty == "SomeOtherValue"));
DoStuff();
}
有没有办法可以避免先进行Exists检查,然后再进行分配?
我知道我可以使用FirstOrDefault,如下所示:
List<MyType> objectList = MyType.GetList();
MyType objectInstance = new MyType();
objectInstance = objectList.FirstOrDefault(o => o.MyProperty == "SomeValue"));
if (objectInstance != null)
DoStuff();
else
{
objectInstance = objectList.FirstOrDefault(o => o.MyProperty == "SomeValue"));
if (objectInstance != null)
DoStuff();
}
但这似乎没有效率。
我希望能够做的是具有类似于TryParse()的行为。我知道我可以为此编写自己的包装器,如果没有内置的方法,我会这样做,但我想在我做之前先检查一下。基本上,我想要的是:
List<MyType> objectList = MyType.GetList();
MyType objectInstance = new MyType();
if (objectList.TryFirst(o => o.MyProperty == "SomeValue", out objectInstance))
DoStuff();
else if (objectList.TryFirst(o => o.MyProperty == "SomeOtherValue", out objectInstance))
DoStuff();
答案 0 :(得分:1)
只需使用第一个元素的此属性创建查找:
var lookup = objectList.GroupBy(x=> x.MyProperty).ToDictionary(x=> x.MyProperty, x=> x.First());
if(lookup.TryGetValue("SomeValue", out objectInstance) || lookup.TryGetValue("SomeOtherValue", out objectInstance))
{
DoStuff();
}
答案 1 :(得分:0)
var objectInstance =
objectList.FirstOrDefault(o => o.MyProperty == "SomeValue")) ??
objectList.FirstOrDefault(o => o.MyProperty == "SomeOtherValue"));
if (objectInstance != null) DoStuff();
答案 2 :(得分:0)
FirstOrDefault是TryParse的等价物。当你有单独的存在和第一次检查时,这将导致集合被迭代两次。对于非常大的列表或由屈服函数支持的IEnumerables(例如,从SqlDataReader得到结果),这可能会非常昂贵。
答案 3 :(得分:-1)
您是否正在尝试缩短源代码行数?好的,你可以做类似的事情(但由于排序而有点慢):
var objectInstance = objectList.OrderByDescending(o => o.MyProperty == "SomeValue").ThenByDescending(o => o.MyProperty == "SomeOtherValue").FirstOrDefault();
if (objectInstance.MyProperty == "SomeValue" || objectInstance.MyProperty == "SomeOtherValue")
{
DoStuff();
}
如果您需要按顺序找到满足条件的完全第一个元素,您也可以在排序前选择索引。