如果匹配ChildID,则需要帮助从ParentID检索数据(读取txt文件并在控制台中对其进行排序)

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (4)

基本上,我有一个文件,我需要阅读\打开并在控制台排序。

该文件可以包含“用户”希望拥有的行数,并且看起来像这样

1,元件,

2,要素1,1

3,元素2,2

4,element23,1

等等...

第一部分是父ID,中间是它的名称,第三部分是ChildID

如果ChildID等于ParentID,我需要在它下面写它,所以看起来应该是这样

1,元件,

  2,element1,1

        3,element2,2

   4,element23,1

我首先尝试记住临时变量中的每个部分,然后稍后进行比较,但由于这不起作用,我创建了一个由我使用的元素组成的列表.Split函数

通过2 for循环,我得到它来排序它,但问题来自我在列表中稍后得到一个元素需要放在开头的某个地方。它在正确的元素下排序,但顺序不正确。

public class information
{
    public string Parent;
    public string Name;
    public string Child;
    public Information

  public Information  (string ParentID, string NameID, string ChildID)
    {
        Parent = ParentID;
        Name = NameID;
        Child = ChildID;
    }
}

这是我检查两个ID的条件并写出结果的部分。

        for (int i = 0; i < list.Count; i++)
        {
            if (list[i].Child == "")
            {
                Console.WriteLine(list[i].Parent + " " + list[i].Name + " " + list[i].Child);

            }
            for (int k = 0; k < list.Count; k++)
            {
                if (list[i].Parent == list[k].Child)
                {
                    Console.WriteLine("\t" + list[k].Parent + "," + list[k].Name + "," + list[k].Child);

                }
            }

        }

所以,问题是,当我写出这样一行时,它不会放在正确的部分,我也不知道如何执行“\ t”以便它继续,这取决于写入的元素数量在它之前。

我相信应该使用递归方法,但此时我不知道该怎么做。

提问于
用户回答回答于

信息类现在还包含子项列表:

class Information
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string ParentId { get; set; }
    public List<Information> Children = new List<Information>();
}

样本数据:

var data = new List<string>
{
    "2,element1,1",
    "1,element,",
    "3,element2,2",
    "4,element23,1"
};

构建数据的逻辑:

//Create a dictionary of all items (for performance)
var dict = data
    .Select(s => s.Split(','))
    .Select(s => new Information
    {
        Id = s[0],
        Name = s[1],
        ParentId = s[2]
    })
    .ToDictionary(s => s.Id);

//Link the items by adding each item to the children list
foreach (var v in dict.Values)
{
    if (!string.IsNullOrWhiteSpace(v.ParentId))
    {
        dict[v.ParentId].Children.Add(v);
    }
}

创建一个调用自身以递归打印的方法:

void PrintRecursive(Information i, int tabCount)
{
    //Print the item
    Console.WriteLine($"{new string('\t', tabCount)}{i.Id},{i.Name},{i.ParentId}");

    foreach (var child in i.Children.OrderBy(o => o.Id))
    {
        //Call the same method with increased tab
        PrintRecursive(child, tabCount + 1);
    }
}

最后,为最高级别的所有父项调用print方法:

//Print recursively
foreach(var item in dict.Values.Where(o => string.IsNullOrWhiteSpace(o.ParentId)))
{
    PrintRecursive(item, 0);
}

热门问答

录音识别sdk的录音文件如何保存?

Richel码农
推荐

1.实时语音sdk内置录音器采集音频暂不支持保存语音数据,如需要保存语音数据建议上层自行采集音频数据。

2.实时语音识别sdk不支持暂停&继续操作,停止识别后重新调用start即开始识别。

云通讯im 本地消息存储数据库能否开放使用,要做一个本地聊天记录搜索功能?

推荐
您好,首先核实下您是否咨询app本地存储?App 本地存储;默认情况下,SDK 内部会对收到的消息进行存储,无需用户进行存储。用户可调用接口获取本地消息(无网络操作),另外,通过 getMessage 接口,也会获取本地消息,如果本地消息存在断层,会通过漫游消息补全。消息存储详参...... 展开详请

服务器操作台不是Windows咋换?

蒋小爱

腾讯云 · 技术支持 (已认证)

推荐
您好,您参考重装Windows系统;仅支持中国大陆地域(不含香港)。例如,Linux 重装为 Windows,Windows 重装为 Linux 。 登陆控制台 图片.png 选择【公共镜像】中Windows ,配置Windows密码,点击【开始重装】即可更换Windows 图片...... 展开详请

Golang云函数怎么做CORS?

Alfred

腾讯云 · 高级产品经理 (已认证)

推荐
设置响应 header 主要也就是相应数据结构, https://github.com/tencentyun/scf-go-lib/blob/master/cloudevents/scf/apigw.go APIGatewayProxyResponse 结构中的 header 字...... 展开详请

IM如何在离线登录后获取到多个会话的未读消息数量?

风子猪未来的前端开发工程师!成长的路上加油!勿忘初心方得始终
推荐
您好,建议按照以下步骤操作: 1. 离线上线后调用 webim.syncMsgs(updateUnreadCount); // 同步未读消息。 2. 在updateUnreadCount 回调函数中调用 webim.MsgStore.sessMap();获取会话列表,返回值是...... 展开详请

腾讯云短信服务有没有提供接口?

滑稽园扛把子

Swoole Inc · PHP工程师 (已认证)

As a PHP Developer
推荐
有接口的,个人认证用户不支持使用 API 申请短信模板,企业用户可以。详情文档:https://cloud.tencent.com/document/product/382/5817 URL 示例 POST https://yun.tim.qq.com/v5/tlssmssvr...... 展开详请

所属标签

扫码关注云+社区

领取腾讯云代金券