如何根据他们的层次结构对 obj 进行排序



给定 2 个对象PeopleRelation

public class People
{   
    public int id ;
    public string externalId;
    public PostalInfo postalInformation;
}
public class Relation
{        
    public int id ;
    public int type ;
    public string sourceExternalId ;
    public string destExternalId ;
}

People在哪里存储有关某人的信息.
并且Relation存储 2 People之间的联系。

如何根据人们的等级对他们进行排序,从"最老的"(更深的(到不太重要的?

我所说的较老,是指与其他元素绑定较少的元素。因此,订购时,我可以验证并创建这些元素而不会丢失引用。但是由于验证是由人类进行的,我迫不及待地想将它们全部提交一次。

var peoplesAwaitingValidation =
    new List<People> {
        new People{ id = 1 , externalId = "A" },
        new People{ id = 2 , externalId = "B" },
        new People{ id = 3 , externalId = "C" },
        new People{ id = 4 , externalId = "D" },
        new People{ id = 5 , externalId = "E" },
        new People{ id = 6 , externalId = "F" },
    };
var relationsAwaitingValidation =
    new List<Relation> {
        new Relation{ id = 1 , sourceExternalId = "A", destExternalId = "B" },
        new Relation{ id = 2 , sourceExternalId = "A", destExternalId = "C" },
        new Relation{ id = 3 , sourceExternalId = "A", destExternalId = "D" },
        new Relation{ id = 4 , sourceExternalId = "E", destExternalId = "A" },
        new Relation{ id = 3 , sourceExternalId = "E", destExternalId = "B" }
    };
//Expected result :
var orderedPeoplesAwaitingValidation = new List<People> {
                                                    // Weight
        new People{ id = 6 , externalId = "F" },    // 0 
        new People{ id = 5 , externalId = "E" },    // 1
        new People{ id = 1 , externalId = "A" },    // 2 
        new People{ id = 3 , externalId = "C" },    // 3
        new People{ id = 4 , externalId = "D" },    // 3
        new People{ id = 2 , externalId = "B" },    // 5
    };

我想到的图形表示:

1        2        3   // <==  Weight
E  --->  A  --->  B
            --->  C
            --->  D
   --->  B
F==0

麦克维和尝试

你应该多次

迭代你的关系,以找到从我们知道权重的点开始的新关系。

Dictionary<string, int> weights = peoplesAwaitingValidation
    .Where(x => relationsAwaitingValidation
        .Count(o => o.destExternalId == x.externalId) == 0)
    .ToDictionary(o => o.externalId, o => 0);
int processed = 0;
while (processed < relationsAwaitingValidation.Count - 1)
    foreach (Relation r in relationsAwaitingValidation)
        if (weights.ContainsKey(r.sourceExternalId) &&
           !weights.ContainsKey(r.destExternalId))
        {
            weights.Add(r.destExternalId, weights[r.sourceExternalId] + 1);
            processed++;
        }

注意:此代码假定始终至少有一个根用户与它没有连接。

最新更新