如何在 C 中填充嵌套的对象列表#

How to populate a nested list of objects in C#

提问人:usercsharp 提问时间:7/28/2021 最后编辑:Patrick Artnerusercsharp 更新时间:7/28/2021 访问量:806

问:

我有一个如下所示的班级:

public class Par
    {
        public string id { get { return id; } set { id = value; } }
        public Int32 num { get { return num; } set { num = value; } }
}

现在我创建了一个名为“Msg”的类,它有一个嵌套的 Par 对象列表

public class Msg 
    {
        private Int32 mid; 
        private Int32 mnum; 
        public List<Par> pList; //list of Par objects

        //constructor of Msg
        public Msg(Int32 mid, Int32 mnum)
        {
            this.mid = mid;
            this.mnum = mnum;
            this.pList = new List<Par>();
        }
  
public void add_ParObject_To_pList(Par obj) 
        {
            pList.Add(obj);
        }

在 main 方法中,我循环遍历文本文件的每一行,并使用 foreach 循环提取其内容

foreach (string line in lines)
//I have instantiated a list of Msg objects named "MList"
    List<Msg> MList = new List<Msg>();

    //my code to extract data from each line 

    Par pobj = new Par(id, num); //instantiating a Par object 

    //code to check within MList if there exists a Msg object with extracted mid and mnum values from file. If not, then new Msg object must be added to this list passing in this mid and mnum.
    MList.Add(new Msg(mid, mnum));







 


    

问题: 如何调用和填充嵌套的“pList”(包含 id 和 num 的 Par 对象列表),它属于此 foreach 循环中的 Msg 对象?

另外,这是我的文本文件中的示例数据:

MNUM 同上 数字
1 10 1000 200
1 10 2000 201
2 20 1000 101
2 20 2000 102

目标是代码应按如下方式排列 MList(Msg 对象列表)中的数据(基于提供的示例数据):

msglist[0] -> 1, 10 pList[0]: 1000 200, 列表[1]: 2000 201

msglist[1] -> 2, 20 pList[0]: 1000 101, 列表[1]: 2000 102

我将不胜感激任何建议/意见。提前致谢。

C# 嵌套 初始化 嵌套列表 面向对象分析

评论

1赞 Some programmer dude 7/28/2021
为什么要为 C# 问题添加 C 语言标记?请不要添加不相关甚至错误的标签。
0赞 Patrick Artner 7/28/2021
为什么要在循环中创建列表?它永远不会以这种方式容纳超过 1 个项目,因为它每次都会在循环开始时重新创建!
0赞 Patrick Artner 7/28/2021
您需要将 PAR 添加到您的味精中。如果它们按顺序排列,您可以简单地读取属于当前 MSG 的所有 PAR 并执行 - 或者您在 MList 中查找正确的 MSG-Obj(例如 Linq,Where,基于其 ID - 可能需要使用 System.Linq)并将其添加到其中。首先修复创建逻辑中的错误。然后通过谷歌进行研究 - 应该会给你很多结果(也许按属性替换 idMList.Last().add_ParObject_To_pList(pobj)c# Find element in list using linq by id site:stackoverflow.com)
0赞 dmedine 7/28/2021
我不认为你设计得正确。文本文件有 4 个字段。因此,您的类也应该有 4 个字段。创建消息后,可以使用 Linq 提取出与要制作消息时所需的任何条件匹配的项目。Par
0赞 Patrick Artner 7/28/2021
文本文件中的数据@dmedine拆分为 2 个类,这些类共同具有所有需要的字段?

答:

1赞 Caius Jard 7/28/2021 #1

在解析文件时保留 Msg 字典,而不是 List;字典的查找速度很快,您将对每一行进行查找

var msgs = new Dictionary<string, Msg>();

foreach(var line in File.ReadAllLines("path to file"){

  //code to get the column values from line here blah blah
  var mid = ...
  var mnum = ...

  //msg caching logic 

  if(!msgs.ContainsKey(mid))
    msgs[mid] = new Msg(mid, mnum);

  var p = new Par(...)

  msgs[mid].pList.Add(p);

}

您可以保留字典并使用它,或者如果您希望将所有 Msg 放在 list/array/enumerable 等中,您可以访问字典的属性.Values

请命名 -> 和 ->(或放弃该方法;列表是公开的)。在 c# 中,PublicPropertiesAndMethodsArePascalCasepListPListadd_ParObject_To_pListAddParObjectToPList