我的课如下:

public class Feature
{
    public string Name { get; set; }

    public string DisplayName { get; set; }

    public List<Feature> SubFeatures { get; set; } = new List<Feature>();
}


然后,我有一个List<Feature> features = new List<Feature>;来存储所有功能。

现在,我想知道我的Feature变量中是否存在特定的features(按名称)。

但是,它可以存在于任何级别(例如SubFeatureSubFeatureSubFeature)。

我得到的最接近的是:

public bool FeatureExists(Feature feature, string name)
{
    return feature.Name == name || feature.SubFeatures.Select(subFeature => FeatureExists(subFeature, name)).Any(result => result);
}


但这涉及必须在FeatureExists()的调用方上使用for来一次将一个顶级功能传递给它。

我敢肯定有一个更简单的方法可以做到这一点,我该如何正确地做到这一点?

最佳答案

定义这样的递归方法:

public IEnumerable<Feature> FeatureAndSubFeatures(Feature feature)
{
    yield return feature;

    foreach (var subFeature in feature.SubFeatures)
    {
        foreach (var child in FeatureAndSubFeatures(subFeature))
        {
            yield return child;
        }
    }
}


然后使用它:

FeatureAndSubFeatures(feature).Any(x => x.Name == name);


另一个选择是将此方法放在Feature本身上,称为SelfAndSubFeaturesRecursive()之类的方法。

这种方法-编写一种递归展平树的方法,而不是编写一种特定方法来搜索具有给定名称的Feature-非常灵活,因为您可以使用它根据任何条件或任何条件在树中搜索任何节点节点的子集,而不是专门用于仅查找具有特定名称的节点。

您也可以编写它以开始使用一系列功能。就像是:

public IEnumerable<Feature> FeaturesAndSubFeatures(IEnumerable<Feature> features)
{
    foreach (var feature in features)
    {
        yield return feature;

        foreach (var child in FeaturesAndSubFeatures(feature.SubFeatures))
        {
            yield return child;
        }
    }
}


仅当您始终从一组功能开始时才有用,但是在您这样做时会保存一个SelectMany

10-08 00:56