【问题标题】:How to access data on nested List type class [closed]如何访问嵌套列表类型类的数据[关闭]
【发布时间】:2019-08-17 18:38:48
【问题描述】:

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

我可以很好地访问“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


                                               }
                                           }
                                       }


                                }


                            });
                        }




                    }


                }           

            }

        }



    }
}

感谢您的宝贵时间。

[为澄清而编辑]

@博斯科 @朱梦

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

user1
      project1
               inv1
               inv2
      project2
               inv1
user2
...

我可以访问 datagroupProject 并获取值,但我如何访问其中的列表 datagroupCabs 并循环访问它? 希望这能澄清我的需要。 再次感谢您的时间。

【问题讨论】:

  • 这取决于您想在datagroupProject 中访问的方式和内容,您仍然可以循环访问它,因为它是一个列表或使用 linq。
  • 您有一个项目集合,显然您只想在这一行中提取 1 个数字:string tmpNumProj= r.???。至少在我看来是这样的。您需要清楚您要提取哪些项目并采取NumProj。你能告诉我们这个吗?首先?最后?它们都一样吗?
  • “我怎样才能访问另一个类列表中的一个类列表。”由于它是一个普通属性,您可以像访问任何其他属性一样访问它:r.Project。然后你需要知道你想要索引哪个元素。在特定位置选择元素由[index] 完成,如r.Project[0]

标签: c# list class nested


【解决方案1】:

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

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

你需要添加

using System.Linq;

到文件的头部。

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

编辑:

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

查看我的截图:https://gitlab.com/snippets/1886702

【讨论】:

  • 您好,我使用的是更“传统”的方式来访问它。但谢谢你的想法。基于此,我如何获取信息。在 datagroupCabs 中,这是 r.Project 中的另一个列表类并循环遍历它?
  • 只是一个foreach循环中的一个foreach循环
  • 但是第二次 foreach 是什么?因为我必须使用 code headers = new List() { new datagroupCabs { ...我不认为我可以这样访问它,对吧?
  • 我更新了我的答案。我使用测试数据创建了一个带有解决方案的片段,以教您如何访问列表中的列表及其属性以及如何使用 linq 进行操作。希望这对刚开始使用 c# 的人有所帮助。不错的提示:使用 javascript 的原型函数可以完成几乎相同的事情。
  • 好的,我想我现在明白了。非常感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2020-11-28
相关资源
最近更新 更多