如何访问嵌套列表类型类上的数据

时间:2019-08-17 18:38:48

标签: c# list class nested

基于以下代码,如何访问另一个列表中的类列表。

我可以很好地访问“ datatosend”项,但是一旦到达dataGroup内部实例化的datagroupProject,我就不知道如何从datagroupProject和datagroupCabs中获取值。

如何获取和存储这些值,以便我可以使用它们?

foreach (dataGroup r in datatosend)
{
    string tmpusrn = r.User;
    string tmpNumProj= r.???

...

do something...

}



这是我存储数据的地方:

datatosend.Add(new dataGroup()
                            {

                                User = cUnum,
                                UserName = cUname,
                                Project = new List<datagroupProject>()
                                {
                                       new datagroupProject
                                       {
                                           NumProj = cProNum,
                                           headers = new List<datagroupCabs>()
                                           {
                                               new datagroupCabs
                                               {
                                                   invoice = tmpinvoice,
                                                   datainv = tmpdate,
                                                   provider = tmpProov


                                               }
                                           }
                                       }


                                }


                            });

这是我创建类的方式:

public class dataGroup
        {
            public string User { get; set; }
            public string UserName { get; set; }

            public List<datagroupProjects> Project { get; set; }

        }

        public class datagroupProject
        {
            public string NumProj { get; set; }
            public List<datagroupCabs> headers { get; set; }

        }

        public class datagroupCabs
        {
            public string invoice { get; set; }
            public string datainv { get; set; }
            public string provider { get; set; }
            public List<datagrouplines> refs { get; set; }

        }

以下是整件事,以备不时之需:

namespace testinv
{
    class Program
    {

        static void Main(string[] args)
        {

            _GLOBALS.InitAll();
            GetUsersData();
        }

        public class dataGroup
        {
            public string User { get; set; }
            public string UserName { get; set; }

            public List<datagroupProjects> Project { get; set; }

        }

        public class datagroupProject
        {
            public string NumProj { get; set; }
            public List<datagroupCabs> headers { get; set; }

        }

        public class datagroupCabs
        {
            public string invoice { get; set; }
            public string datainv { get; set; }
            public string provider { get; set; }
            public List<datagrouplines> refs { get; set; }

        }



        public static void GetUsersData()
        {


            Console.WriteLine("Init");

            string cUnum = "";
            string cUname = "";
            string cProNum = "";
            List<dataGroup> datatosend = new List<dataGroup>();
            List<datagroupProject> datatosendproj = new List<datagroupProject>();
            List<datagroupCabs> datatsendCabs = new List<datagroupCabs>();

            DataTable dtUsers = new DataTable();
            dtUsers = BSTOOLS.GetUserData("");

            foreach (DataRow u in dtUsers.Rows)
            {



                cUnum = u.ItemArray[0].ToString();
                cUname = u.ItemArray[1].ToString();


                DataTable dtProjects = new DataTable();
                dtProjects = BSTOOLS.GetProjects(cUnum);

                foreach (DataRow p in dtProjects.Rows)
                {

                    cProNum = p.ItemArray[0].ToString();
                    DataTable dtlines = new DataTable();

                    dtlines = BSTOOLS.DistinctGetDeliveryNotesLines(cProNum);

                    foreach (DataRow l in dtlines.Rows)
                    {
                        string tmpinvoice = "";
                        string tmpdate = "";
                        string tmpProov = "";


                        string tmpiClave = l.ItemArray[0].ToString();

                        DataTable resultCab = new DataTable();
                        resultCab = BSTOOLS.checkifFlow(tmpiClave);

                        if(resultCab.Rows.Count  > 0)
                        {

                            foreach (DataRow c in resultCab.Rows)
                            {
                                tmpinvoice = c.ItemArray[0].ToString();
                                tmpdate = c.ItemArray[1].ToString();
                                tmpProov = c.ItemArray[2].ToString();
                            }

                            datatosend.Add(new dataGroup()
                            {

                                User = cUnum,
                                UserName = cUname,
                                Project = new List<datagroupProject>()
                                {
                                       new datagroupProject
                                       {
                                           NumProj = cProNum,
                                           headers = new List<datagroupCabs>()
                                           {
                                               new datagroupCabs
                                               {
                                                   invoice = tmpinvoice,
                                                   datainv = tmpdate,
                                                   provider = tmpProov


                                               }
                                           }
                                       }


                                }


                            });
                        }




                    }


                }           

            }

        }



    }
}

谢谢您的时间。

[需要澄清的内容]

@博斯科 @朱Zhu

基本上,我需要数据组中的每个用户,在datagroupProject中遍历他的项目,以获取项目和datagroupCabs中的所有项目(这是datagroupproject中的另一个List类)。所以最终会变成这样:

user1
      project1
               inv1
               inv2
      project2
               inv1
user2
...

我可以访问datagroupProject并获取值,但是如何访问其中的列表datagroupCabs并遍历它呢? 希望这可以澄清我的需求。 再次感谢您的宝贵时间。

1 个答案:

答案 0 :(得分:1)

只是获得您添加的第一个值:

string tmpNumProj= r.Project?.FirstOrDefault()?.NumProj ?? string.Empty;

您需要添加

using System.Linq;

到文件的开头。

但这仅适用于第一项。 看起来您是C#的新手,只需查看一些文档和教程即可。

编辑:

我为所有不知道如何访问列表中的列表以及如何使用linq的人添加了完整的教学解决方案。

看到我的网址是:https://gitlab.com/snippets/1886702