C # Как получить доступ к классу брата из функции класса? - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть код, подобный приведенному ниже.Я упростил это с помощью строго необходимого вопроса.

У меня есть класс Parent, который включает в себя класс Item1, класс Item2, класс Item1_to_Item2_relationship.Я должен сохранить эту структуру по причинам, не относящимся к этой проблеме.

Как получить доступ к значению в Item1 из Item2?Код лучше объясняет, что нужно сделать.

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, и выполнять там логику.Но я считаю, что должен быть лучший, более интуитивный способ.Как я могу заставить работать приведенный выше код?

Ответы [ 4 ]

0 голосов
/ 13 декабря 2018

Я не фанат того, как структурирован код ... но вот простой ответ.

Вы добавляете два разных типа элементов в две разные коллекции.

Высоздаем элемент отношений, который связывает два на основе id

Хотя ваши крики кода помогают понять идею, она логична и является хорошим способом связать такие элементы, как работа с базой данных.

Мы можем сделать это просто с помощью Linq, но я бы предпочел придерживаться того, какты пишешь вопрос.

Сначала итерируйте свои элементы, как вы делаете, а затем итерируйте свои отношения.На основе сравнения идентификаторов вы затем выполняете итерации по другим пунктам, и на основе этого окончательного сравнения идентификаторов вы получаете ответ.

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
0 голосов
/ 13 декабря 2018

Самый быстрый и простой способ сделать это - передать 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 конструктору отдельных элементов и прикрепить его к элементу как свойство объекта, но я бы избегал такого подхода, если бы вы могли просто поддерживать чистоту.

0 голосов
/ 13 декабря 2018

Как уже упоминалось в других ответах, вы можете получить к нему доступ напрямую.Поскольку вы поддерживаете отношения, я предполагаю, что вы хотите сделать это через отношения

            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. код в настоящее время добавит пустую строку, так как вы не добавляете код в отношение, но вы всегда можете искать объект с помощью идентификатора, что означает другой поиск в списке, поэтому я говорю, что вы можете изменить основнойструктура данных.
  4. Может быть лучше хранить отдельные объекты также в словаре, если их код элемента является первичным ключом.
0 голосов
/ 13 декабря 2018

'просто сделай это'

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

i1.id = i2.id;

Теперь другие будут утверждать, что вы должны использовать свойства, а не открытые поля.Но то, что у вас есть на данный момент, позволяет вам делать именно то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...