Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何根据属性关系将实例集合按类型从最小依赖到最大依赖进行排序?_C# - Fatal编程技术网

C# 如何根据属性关系将实例集合按类型从最小依赖到最大依赖进行排序?

C# 如何根据属性关系将实例集合按类型从最小依赖到最大依赖进行排序?,c#,C#,如果我有以下具有某些属性的类。如何创建一个方法来按属性依赖性对它们进行排序?请查看代码中的注释以查看预期结果 class-One{} 二班{ 一个{get;set;} } 三班{ 一个{get;set;} 四个D{get;set;} } 四班{ 两个B{get;set;} } 五班{ 六F{get;set;} } 六班{ 一个{get;set;} 五个E{get;set;} } 七班{ 五个E{get;set;} } 公共课程 { 公共静态void Main() { 变量集合=[ 新六条(),

如果我有以下具有某些属性的类。如何创建一个方法来按属性依赖性对它们进行排序?请查看代码中的注释以查看预期结果

class-One{}
二班{
一个{get;set;}
}
三班{
一个{get;set;}
四个D{get;set;}
}
四班{
两个B{get;set;}
}
五班{
六F{get;set;}
}
六班{
一个{get;set;}
五个E{get;set;}
}
七班{
五个E{get;set;}
}
公共课程
{
公共静态void Main()
{
变量集合=[
新六条(),
新三条(),
新七条(),
新的(),
新五条(),
新二(),
新四
];
var dependentCollection=buildCollectionByPropertyDependence(集合);
//dependentCollection=>[
//[一],,
//[二,六,五],
//[四,七],
//[三]
// ]
}
//public…buildCollectionByPropertyDependence(){…}
}

您需要确定类之间的继承/依赖关系以及它们之间的关系(在您的案例属性中),您可以使用它来生成类的树/图结构,并确定根节点。然后,您可以使用每个节点的树深度对列表进行排序,或者只对继承树进行广度优先搜索/遍历(BFS),这将自然地创建您正在寻找的有序列表

这种方法适用于任何继承/依赖结构

你能提供更多关于排序逻辑的细节吗?从你的帖子上还不完全清楚。我描述的方法相当通用,但我认为它应该适合您


然而,正如一条评论所提到的,
Properties.Count
可以帮助您实现这一点,但是如果没有添加任何属性的子类可以正确排序。

如果您只是指属性的数量:

IEnumerable<object[]> BuildCollectionByPropertyDependance(object[] objects)
{
    return objects
        .GroupBy(o => o.GetType().GetProperties().Count)
        .OrderBy(grp => grp.Key)
        .Select(grp => grp.ToArray());
}
IEnumerable BuildCollectionByPropertyDependence(对象[]对象)
{
返回对象
.GroupBy(o=>o.GetType().GetProperties().Count)
.OrderBy(grp=>grp.Key)
.Select(grp=>grp.ToArray());
}
或者,如果你的意思是递归的,类似于以下内容:

IEnumerable<object[]> BuildCollectionByPropertyDependance(object[] objects)
{
    return objects
        .GroupBy(o => CountNestedProperties(o.GetType()))
        .OrderBy(grp => grp.Key)
        .Select(grp => grp.ToArray());
}

int CountNestedProperties(Type type, IList<Type> checked = null)
{
    checked = checked ?? new List<Type>();

    if (checked.Contains(type))
    {
       return 0;
    }

    if (type.IsPrimitive)
    {
        return 1;
    }

    checked.Add(type);

    return 1 + type.GetProperties().Sum(prop => CountNestedProperties(prop.PropertyType, checked));
}
IEnumerable BuildCollectionByPropertyDependence(对象[]对象)
{
返回对象
.GroupBy(o=>CountNestedProperties(o.GetType())
.OrderBy(grp=>grp.Key)
.Select(grp=>grp.ToArray());
}
int CountNestedProperties(类型类型,IList checked=null)
{
选中=选中??新列表();
如果(选中。包含(类型))
{
返回0;
}
if(类型为IsPrimitive)
{
返回1;
}
选中。添加(类型);
返回1+type.GetProperties().Sum(prop=>CountNestedProperties(prop.PropertyType,选中));
}

使用反射:
GetProperties().Count
?因此您需要拓扑排序,但也希望允许循环(FiveSix),然后在结果中展平到相同的级别?另外,您的问题是如何使用反射构建依赖关系图,还是获得依赖关系图后如何从该图生成顺序?@IanMercer Correct。如何生成一个顺序。所以拓扑排序是正常的技术,但是由于你不知道从哪里开始,循环无法工作。取而代之的是考虑PageRank等算法,这些算法可以在周期存在时基于节点之间的依赖关系来订购图表。要获得完整的属性列表,请使用“GetProperties(BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)”可能不是树,因此拓扑排序可能更合适。是的,我重新阅读了这个问题,我意识到他问的是属性关系,而不仅仅是子类关系。我认为粗略的策略无论如何都会奏效。很好,除了<代码>五个<代码>六个<代码>五个<代码>六个
StackOverflow
.Ye,没有考虑循环引用。刚刚修正。