【问题标题】:C# How to access a brother class from within a class function?C#如何从类函数中访问兄弟类?
【发布时间】:2018-12-12 23:35:45
【问题描述】:

我的代码结构如下所示。我只用提出问题的严格要求来简化它。

我有一个 Parent 类,其中包括 Item1 类、Item2 类、Item1_to_Item2_relationship 类。由于与此问题无关的原因,我必须保留此结构。

如何从 Item2 访问 Item1 中的值? 该代码更好地解释了需要做什么。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            Parent parent = new Parent();

            // Adding item1 values
            Item1 item1_01 = new Item1();
            item1_01.id = "item1_01";
            item1_01.item1_code = "CODE_01";
            parent.items1.Add(item1_01);
            Item1 item1_02 = new Item1();
            item1_02.id = "item1_02";
            item1_02.item1_code = "CODE_02";
            parent.items1.Add(item1_02);

            // Adding item2 values
            Item2 item2 = new Item2();
            item2.id = "item2_01";
            parent.items2.Add(item2);

            // Adding relationships
            Item1_to_Item2_Relationship item1_to_Item2_Relationship = new Item1_to_Item2_Relationship();
            item1_to_Item2_Relationship.item1.id_alt = item1_01.id;
            item1_to_Item2_Relationship.item2.id_alt = item2.id;
            parent.Item1_to_Item2_Relationships.Add(item1_to_Item2_Relationship);

            item1_to_Item2_Relationship = new Item1_to_Item2_Relationship();
            item1_to_Item2_Relationship.item1.id_alt = item1_02.id;
            item1_to_Item2_Relationship.item2.id_alt = item2.id;
            parent.Item1_to_Item2_Relationships.Add(item1_to_Item2_Relationship);

            // How to make the code below return a List<string> with the values "CODE_01" and "CODE_02"?
            foreach (Item2 my_item2 in parent.items2)
            {
                my_item2.item1_codes;
            }


        }
    }

    class Parent
    {
        public List<Item1> items1;
        public List<Item2> items2;
        public List<Item1_to_Item2_Relationship> Item1_to_Item2_Relationships;

        public Parent()
        {
            items1 = new List<Item1>();
            items2 = new List<Item2>();
            Item1_to_Item2_Relationships = new List<Item1_to_Item2_Relationship>();
        }

    }
    class Item1
    {
        public string id;
        public string id_alt;
        public string item1_code;
        public Item1()
        {
            id = "";
            item1_code = "";
        }
    }
    class Item2
    {
        public string id;
        public string id_alt;
        public Item2()
        {
            id = "";
        }
    }
    class Item1_to_Item2_Relationship
    {
        public Item1 item1;
        public Item2 item2;

        public Item1_to_Item2_Relationship()
        {
            item1 = new Item1();
            item2 = new Item2();
        }
    }
}

目前,我必须纠正一个接收 Parent 参数的静态函数并在那里执行逻辑。但我相信应该有更好更直观的方式。我怎样才能使上面的代码工作?

【问题讨论】:

  • 由于class Item1的字段是公开的,给定一个Item1对象,Item2方法中的代码可以只引用该字段。

标签: c# .net oop


【解决方案1】:

如其他答案中所述,您可以直接访问它。既然你在维持一段关系,我假设你想通过这段关系来做到这一点

            var test = new List<String>();            
            foreach (Item2 my_item2 in parent.items2)
            {
                foreach (var item in parent.Item1_to_Item2_Relationships)
                {
                    //implement your own equality comparision if it should be differernt
                    if (item.item2.id_alt == my_item2.id)
                    {
                        test.Add(item.item1.item1_code);
                    }
                }
            }

几个重点:

  1. 您正在处理列表和嵌套循环, 方法不是最好的。
  2. 为了提高性能,关系数据结构应该是 明智地选择,是否可以将其转换为Dictionary,因此 提供更快的查找时间。
  3. 代码当前将添加空白字符串,因为您没有在关系中添加代码,但您始终可以使用 id 搜索对象,这意味着在列表中进行另一个搜索,这就是我说您可能想要的原因更改底层数据结构。
  4. 如果项目代码是主键,则最好将各个对象也存储在字典中。

【讨论】:

    【解决方案2】:

    最快和最简单的方法是将parent 传递到itemX 需要从itemY 访问属性的函数中。

    例如:

    class Item1
    {
        public string id;
        public string id_alt;
        public string item1_code;
        public Item1()
        {
            id = "";
            item1_code = "";
        }
    }
    class Item2
    {
        public string id;
        public string id_alt;
        public Item2()
        {
            id = "";
        }
        public void AccessItem1Prop(Parent parent) {
            string item1ID = parent.items1[0].id;
        }
    }
    

    您也可以将parent 传递给单个项目的构造函数,并将其作为对象属性附加到项目,但如果您可以简单地保持事情清洁,我会避免这种方法。

    【讨论】:

    • IMO,我认为让姐妹对象相互访问的方法在结构上并不是一个好主意。理论上,这两个对象是不同的,因为它们不应该知道彼此的存在。通常,父母的工作是管理其孩子。
    【解决方案3】:

    我不喜欢代码的结构...但这里有一个简单的答案。

    您正在将两种不同的项目类型添加到两个不同的集合中。

    您正在创建一个关系项,它根据 id 将两者关联起来。

    尽管您的代码尖叫有助于这个想法是合乎逻辑的,并且是关联项目(例如使用数据库)的好方法。

    我们可以使用 Linq 简单地做到这一点,但我宁愿更贴近您如何编写问题。

    首先像你正在做的那样迭代你的项目,然后迭代你的关系。然后根据 Id 比较迭代其他项目,并根据最终的 Id 比较得到答案。

    foreach (Item2 my_item2 in parent.items2)
    {
        foreach (Item1_to_Item2_Relationship relatedItem in parent.Item1_to_Item2_Relationships)
        {
            if (my_item2.id == relatedItem.item2.id_alt)
            {
                foreach (Item1 item1 in parent.items1)
                {
                    if (relatedItem.item1.id_alt == item1.id)
                    {
                        Console.WriteLine(item1.item1_code);
                    }
                }
            }
        }
    }
    
    //Outputs
    //CODE_01
    //CODE_02
    

    【讨论】:

      【解决方案4】:

      '就这样吧'

      var i1 = new Item1();
      var i2 = new Item2();
      
      i1.id = i2.id;
      

      现在其他人会争辩说您应该使用属性而不是公共字段。但是你现在拥有的东西可以让你做你想做的事。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-20
        • 1970-01-01
        • 1970-01-01
        • 2014-07-04
        • 2019-07-25
        • 2022-01-20
        • 1970-01-01
        相关资源
        最近更新 更多