首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#递归搜索一个Objects.parent_id数组中的值,然后搜索这些值等等,直到没有任何值。

C#递归搜索一个Objects.parent_id数组中的值,然后搜索这些值等等,直到没有任何值。
EN

Stack Overflow用户
提问于 2019-09-11 00:01:33
回答 1查看 780关注 0票数 0

寻找一个解决方案来找到一个object.id,并在一个对象数组中获取所有的parent_id,然后设置object.missed = true. Object.id和Object parent_id。如果对象没有parent_id,那么parent_id = id

我知道如何对一个级别的parent_id进行搜索。如何深入到无限级别?下面是我搜索1级的代码。

代码语言:javascript
复制
public class EPlan 
{
    public int id;
    public int parent_id;
    public bool is_repeatable;
    public bool missed;
}

EPlan[] plans = Array.FindAll(eventsPlan, item => item.parent_id == event_id);
foreach (EPlan plan in plans)
{
    plan.missed = true;
    plan.is_repeatable = false;
}

我正在寻找event_id an int。所以我搜索所有的object.id,寻找event_id。一旦我找到了object.id == event_id,我需要设置object.is_repeatable = falseobject.missed = true

然后,我需要在所有的objects.parent_id中搜索当前object.id (event_id)。将所有这些对象更改为与上面相同的对象。然后,我需要检查所有的object.id和所有的object.parent_id,并对它们做同样的操作。就像树的影响一样。1事件被忽略了,而与该事件亲生的任何事件也需要设置为错过事件。

到目前为止,我所能做的就是获得1层深度,或者在其中编码多个foreach循环。但它可能有10层或更深。所以这没什么意义。

任何帮助都是非常感谢的。必须有更好的方法让多个循环。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-11 02:41:16

我也被这个问题搞糊涂了,除了你说的一句话:

1事件被遗漏,任何与该事件亲生的事件也需要设置为漏掉事件。

考虑到这一点,我建议下面的代码将执行您正在寻找的任务。每次调用该方法时,它都会在数组中找到与ID匹配的所有对象,并适当地将事件设置为MissedIs_Repeatable

它还保存了在扫描过程中找到的Parent_ID的运行列表。循环完成后,它将调用自己,使用父id值列表,而不是它刚才使用的事件id传递列表。这就是使递归在这里工作的诀窍。

要启动该过程,您可以使用为1级搜索执行的单个事件ID调用该方法。

代码语言:javascript
复制
findEvents(new List<string>{event_id}, eventsPlan);

private void findEvents(List<int> eventIDs, EPlan[] eventsPlan)
{
    foreach (int eventID in eventIDs)
    {
        EPlan[] plans = Array.FindAll(eventsPlan, item => item.parent_id == eventID);
        List<int> parentIDs = new List<int>();
        foreach (EPlan plan in plans)
        {
            plan.missed = true;
            plan.is_repeatable = false;
            parentIDs.Add(plan.parent_id);
        }
        if (parentIDs.Count > 0)
           findEvents(parentIDs, eventsPlan);
    }
}

我还建议,如果您有机会重新设计这段代码而不使用数组,但是通用集合(如List<EPlan>)可以避免此代码的性能损失,因为每次调用Array.FindAll方法时它都会在内存中构建新的数组。在这里处理大量数据时,使用泛型集合( Generic ),甚至使用老式的foreach循环将工作得更快。

Update 1:回答您的问题,您可以使用泛型集合来解决这个问题:

代码语言:javascript
复制
private void findEventsAsList(List<int> eventIDs, List<EPlan> eventsPlans)
{
    List<int> parentIDs = new List<int>();
    foreach (EPlan plan in eventsPlans.Where(p => eventIDs.Contains(p.parent_id)))
    {
       plan.missed = true;
       plan.is_repeatable = false;
       parentIDs.Add(plan.parent_id);
    }
    findEventsAsList(parentIDs, eventsPlan);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57879489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档