C# 如何使用LINQ/Lambda来缩短我的C代码段?

C# 如何使用LINQ/Lambda来缩短我的C代码段?,c#,.net,linq,lambda,C#,.net,Linq,Lambda,我写了这段代码,它可以工作,但我想删除3个单独的if语句,并用LINQ完全替换它。可能吗 谢谢大家! public string CategoryTree { get { var parentHandles = ParentTree.Select(c => c.handle).ToList(); if (parentHandles.Contains(DbManagement.ParentSettings.MenuCategory))

我写了这段代码,它可以工作,但我想删除3个单独的if语句,并用LINQ完全替换它。可能吗

谢谢大家!

public string CategoryTree
{
    get
    {
        var parentHandles = ParentTree.Select(c => c.handle).ToList();
        if (parentHandles.Contains(DbManagement.ParentSettings.MenuCategory))
            return DbManagement.ParentSettings.MenuCategory;
        if (parentHandles.Contains(DbManagement.ParentSettings.ProductCategory))
            return DbManagement.ParentSettings.ProductCategory;
        if (parentHandles.Contains(DbManagement.ParentSettings.TagsAdmin))
            return DbManagement.ParentSettings.TagsAdmin;
        return "";
    }
}

我会这样做-这是更快的HashSet查找是O1,而List.Contains是开着的:

假设DbManagement.ParentSettings.MenuCategory是常量或静态字符串,而不是可变实例属性

private static readonly IReadOnlyList<String> _categories = new String[]
{
    DbManagement.ParentSettings.MenuCategory,
    DbManagement.ParentSettings.ProductCategory,
    DbManagement.ParentSettings.TagsAdmin
};

public string CategoryTree
{
    get
    {
        HashSet<String> handles = this.ParentTree
            .Select( c => c.handle )
            .ToHashSet();

        return _categories.FirstOrDefault( c => handles.Contains( c ) ) ?? "";
    }
}
如果DbManagement.ParentSettings不是静态的,并且/或者您可以在每次调用时重新分配它,那么您可以将整个过程简化为一个Linq表达式:

public string CategoryTree
{
    get
    {
        return this.ParentTree
            .Select( c => c.handle )
            .Intersect( new[] {}
                DbManagement.ParentSettings.MenuCategory,
                DbManagement.ParentSettings.ProductCategory,
                DbManagement.ParentSettings.TagsAdmin
            } )
            .FirstOrDefault() ?? "";
    }
}

我会这样做-这是更快的HashSet查找是O1,而List.Contains是开着的:

假设DbManagement.ParentSettings.MenuCategory是常量或静态字符串,而不是可变实例属性

private static readonly IReadOnlyList<String> _categories = new String[]
{
    DbManagement.ParentSettings.MenuCategory,
    DbManagement.ParentSettings.ProductCategory,
    DbManagement.ParentSettings.TagsAdmin
};

public string CategoryTree
{
    get
    {
        HashSet<String> handles = this.ParentTree
            .Select( c => c.handle )
            .ToHashSet();

        return _categories.FirstOrDefault( c => handles.Contains( c ) ) ?? "";
    }
}
如果DbManagement.ParentSettings不是静态的,并且/或者您可以在每次调用时重新分配它,那么您可以将整个过程简化为一个Linq表达式:

public string CategoryTree
{
    get
    {
        return this.ParentTree
            .Select( c => c.handle )
            .Intersect( new[] {}
                DbManagement.ParentSettings.MenuCategory,
                DbManagement.ParentSettings.ProductCategory,
                DbManagement.ParentSettings.TagsAdmin
            } )
            .FirstOrDefault() ?? "";
    }
}

什么是c.handle的类型?什么是ParentTree和handle的类型?是enum吗?什么是ParentSettings类型?您试图通过使用LINQ而不是显而易见的方法来解决什么问题?列表在给定时间是否只包含类别类型?如果是,则可以使用LINQ缩短此代码。parentHandles是否按照您在所示代码中检查的顺序包含DbManagement.ParentSettings的值?如果没有,有没有办法对它们进行排序?c.handle的类型是什么?ParentTree和handle的类型是什么?是enum吗?什么是ParentSettings类型?您试图通过使用LINQ而不是显而易见的方法来解决什么问题?列表在给定时间是否只包含类别类型?如果是,则可以使用LINQ缩短此代码。parentHandles是否按照您在所示代码中检查的顺序包含DbManagement.ParentSettings的值?如果没有,是否有方法对它们进行排序?由于Intersect的实现,如果您执行了_categories.Intersecthandles.FirstOrDefault,则可能会更快,并将按顺序返回结果。当然,如果你真的需要依赖其中一个,你不应该首先使用Intersect。我更喜欢你自己制作的HashSet方法,或者相反的方法更值得信赖。非常好,但我不认为它更快。创建哈希集的成本可能高于创建列表和执行三次搜索的成本。@TheodorZoulias Correct。但在这种特殊情况下,这将是一个微优化。NET被设计用来处理短期复杂对象,如字典等。如果2011年的这篇文章有什么依据的话,Intersect可能会慢一些:微优化,:-由于实现了Intersect,如果执行了_categories.Intersecthandles.FirstOrDefault,则速度可能会更快,并将按顺序返回结果。当然,如果你真的需要依赖其中一个,你不应该首先使用Intersect。我更喜欢你自己制作的HashSet方法,或者相反的方法更值得信赖。非常好,但我不认为它更快。创建哈希集的成本可能高于创建列表和执行三次搜索的成本。@TheodorZoulias Correct。但在这种特殊情况下,这将是一个微优化。NET被设计用来处理短期复杂对象,如字典等。如果2011年的这篇文章有什么依据的话,Intersect可能会慢一些:微优化,:-