gpt4 book ai didi

c# - 用于攀登对象层次结构的 LINQ 表达式?

转载 作者:行者123 更新时间:2023-11-30 22:42:21 27 4
gpt4 key购买 nike

我有一些代码需要扫描分层数据库架构,寻找架构中定义的具有某些有趣属性的属性。我想制作这些属性名称的(平面)列表。

为了(希望)减少混淆,我将架构中定义的类称为“种类”,因为该架构不描述 C# 类层次结构。

我可以将模式作为 .NET 对象树使用;我不需要解析任何 XML 或任何东西。问题是我将在不同的点进入架构树,我需要确保我知道从基类继承的有趣属性以及直接在我定义的类上定义的属性'目前正在查看。

results = new List<PropertyDefinition>;

foreach (Kind objKind in objDescription.PossibleKinds)
{
// Iterate up the schema hierarchy
while (objKind != null)
{
foreach (PropertyDefinition prop in objKind.PropertyDefinitions)
{
if (prop.IsInteresting)
results.Add(prop);
}
// Move up a level in the hierarchical relationship
objKind = objKind.BaseKind;
}
}

无论如何,我想知道是否可以编写等效的 LINQ 语句。最外层的 foreach 循环是微不足道的(为了清楚起见,我实际上省略了另一个循环)但我不确定是否可以在 LINQ 查询中捕获层次结构中向上的迭代。

var query = from objKind in objDescription.PossibleKinds
// What goes here?
from prop in objKind.PropertyDescriptions
where prop.IsInteresting
select prop;

我想这类似于编写一个 LINQ 查询,该查询从链表中的一个节点开始,并不断迭代链表,直到到达末尾。这可能吗?

最佳答案

您无法使用“纯”LINQ 真正做到这一点,但您可以将其与枚举器方法混合使用,这样您就走在了正确的轨道上。例如,在 Kind 类型上定义一个扩展方法,如下所示:

public static IEnumerable<Kind> GetInstanceAndBaseKinds(
this Kind instance)
{
while (instance != null)
{
yield return instance;
instance = instance.BaseKind;
}
}

现在您可以在 LINQ 查询中使用此方法:

from kind in objDescription.PossibleKinds
from baseKind in kind.GetInstanceAndBaseKinds()
from property in baseKind.PropertyDefinitions
where property.IsInteresting
select property;

关于c# - 用于攀登对象层次结构的 LINQ 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4459998/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com