.NET将Exists()与First()结合

时间:2018-06-02 22:14:14

标签: .net linq ienumerable

现在,我有以下代码:

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();

4 个答案:

答案 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();
}

如果您需要按顺序找到满足条件的完全第一个元素,您也可以在排序前选择索引。