【问题标题】:Iterate over a list that contains a self-referencing list遍历包含自引用列表的列表
【发布时间】:2013-07-26 20:15:58
【问题描述】:

假设我有以下数据库模型:

在代码中是这样的:

按钮类别

public class ButtonCategory
{
    public ButtonCategory()
    {
        this.Buttons = new HashSet<Button>();
        this.SubCategories = new HashSet<ButtonCategory>();
    }

    [Key]
    public int Id { get; set; }

    [Required]
    public string Description { get; set; }

    public int? ParentCategoryId { get; set; }

    [ForeignKey("ParentCategoryId")]
    public virtual ButtonCategory ParentCategory { get; set; }

    public virtual ICollection<ButtonCategory> SubCategories { get; set; }

    public virtual ICollection<Button> Buttons { get; set; }
}

按钮

public class Button
{
    [Key]
    public int Id { get; set; }

    public int? ButtonCategoryId { get; set; }

    [ForeignKey("ButtonCategoryId")]
    public virtual ButtonCategory ButtonCategory { get; set; }
}

如您所见,我的 ButtonCategories 有一个自引用列表。

出现的问题是,我想将所有 ButtonCategories 转换为另一种类型,比如说 ButtonCategoriesMock。我想对列表中的所有 Buttons 执行相同的操作。 这样做的问题是我不知道,也不能说,有多少个子级别。有可能只有一个子类,也有可能是子类的子类的子类,……以此类推。

如何轻松地将所有 ButtonCategory 项和 Button 项转换为另一种类型?

提前致谢!

【问题讨论】:

标签: c# linq entity-framework collections


【解决方案1】:

我不确定“容易”,但您可以实现自己的递归扩展方法来做到这一点:

但是,我相信 Traverse 方法和 select 可能会处理您的情况

    public static IEnumerable<T> Traverse<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> fnRecurse)
    {
        foreach (T item in source)
        {
            yield return item;

            IEnumerable<T> seqRecurse = fnRecurse(item);

            if (seqRecurse != null)
            {
                foreach (T itemRecurse in Traverse(seqRecurse, fnRecurse))
                {
                    yield return itemRecurse;
                }
            }

        }
    }

片段可在:LINQ and recursive functions

见:

【讨论】:

    猜你喜欢
    • 2018-06-11
    • 1970-01-01
    • 2012-04-21
    • 2013-05-26
    • 2021-09-15
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多