Как добавить объект в коллекцию из другого объекта?

Как добавить объекты в свойство ICollection? Нужно ли мне сначала инициализировать ICollection? Если да, то как?

У меня есть класс «foo», у которого есть свойство ICollection<bar> с именем «bar». У меня также есть отдельная Коллекция объектов, содержащих десериализованные данные Excel. Я хочу заполнить свойство ICollection<bar> bar, используя эти данные.

Предполагая, что у меня есть экземпляр foo под названием «fooexample», я пытаюсь присвоить значение ICollection<bar> bar, используя «fooexample.bar.id», но я знаю, что это синтаксически неверно.

Класс foo

public class foo 
{     
    public int id { get; set; }
    public string name { get; set; } 
    public ICollection<bar> bar { get; set; }
}

Бар класса

public class bar 
{
    public int id { get; set; }
    public string name{ get; set; } 
}

Добавление объектов из другого объекта

exceldata = ParseDocument.Parse(filestream);
foo fooexample = new foo();
foreach (var object in exceldata)
{
    fooexample.id = object.id;
    fooexample.bar.id = object.bar.id; 
    // <-- how do I do this? if I need to initialize it, how?
}

Мне нужен класс bar.id из класса foo, поэтому он будет таким в foreach -> fooexample.bar.id = object.bar.id

Christian Quirante 10.08.2018 16:42

Понятия не имею, о чем вы спрашиваете. Уточните пожалуйста свой вопрос.

Selman Genç 10.08.2018 16:44

Вы хотите сгруппировать экземпляры bar по идентификатору и создать foo для каждой группы?

Selman Genç 10.08.2018 16:45

Я отредактировал вопрос, пожалуйста, посмотрите ... Надеюсь, теперь понятно ...

Christian Quirante 10.08.2018 16:47

Это поможет понять, если мы узнаем, как объявлен exceldata.

Olivier Jacot-Descombes 10.08.2018 16:53

«fooexample.bar» относится к типу ICollection и не имеет свойства «id», поэтому то, что вы пишете, синтаксически неверно. Вы можете выполнить «fooexample.bar.Add (x)» и - если «object.bar» имеет тип «bar», это может быть «fooexample.bar.Add (object.bar)». Это даст вам коллекцию всех свойств «панели» exceldata. Если это то, о чем вы просите.

Jürgen Röhr 10.08.2018 16:54

@ JürgenRöhr Я имею в виду, что fooexample.bar.id - это то, что я пытаюсь сделать, чтобы получить доступ к панели ICollection <bar> ->, где <bar> имеет свойство "id" на панели общедоступных классов. но да, это синтаксически неверно, потому что он просто показывает "fooexample.bar.Add (relatedobject)", который в данном случае я пытаюсь решить, поскольку он не может преобразовать из строки в панель ICollection.

Christian Quirante 10.08.2018 19:06

Вам нужно: public ICollection<bar> bar { get; } = new List<bar>();, а затем fooExample.bar.Add(new bar { id = obj.id, name = obj.bar.name });

Olivier Jacot-Descombes 10.08.2018 19:42

@ OlivierJacot-Descombes, когда я его помещаю, на нем нет красных линий, но когда я запускаю программу, я получил эту ошибку «Ссылка на объект не установлена ​​на экземпляр объекта».

Christian Quirante 10.08.2018 19:59

это действительно вариант? Я имею в виду свой вопрос или я просто получаю свойство напрямую из класса и не возражаю, если на foo есть ICollection? например, просто получить к нему прямой доступ -> bar.id = obj.id, а не -> перейти к fooExample.bar.Add (relatedobject)

Christian Quirante 10.08.2018 20:01

Потому что вы не инициализируете ICollection<bar> bar. Измените объявление на public ICollection<bar> bar { get; } = new List<bar>();, чтобы создать коллекцию. fooexample.bar.id не работает, т.к. fooexample.bar - это сборник. Вам нужно получить доступ к элементу коллекции. Например: fooexample.bar[0].id

Olivier Jacot-Descombes 10.08.2018 20:01

@ OlivierJacot-Descombes Я инициализировал его, и он опубликован ...

Christian Quirante 10.08.2018 20:02

но удаление "fooExample" заставило его работать ...

Christian Quirante 10.08.2018 20:03

@ OlivierJacot-Descombes большое спасибо за ваше время :)

Christian Quirante 10.08.2018 20:30
1
14
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У меня сложилось впечатление, что на самом деле вам не нужна коллекция, поэтому вы можете сделать следующее.

Класс foo

public class foo 
{     
    public int id { get; set; }
    public string name { get; set; } 
    public bar bar { get; set; }
}

Добавление объектов из другого объекта

exceldata = ParseDocument.Parse(filestream);
foo fooexample = new foo();
foreach (var object in exceldata)
{
    fooexample.id = object.id;
    fooexample.bar = new bar();
    fooexample.bar.id = object.bar.id;
}

В C# есть сокращение для создания экземпляра объекта и установки его свойств в одной строке, чтобы вы могли в качестве альтернативы иметь

exceldata = ParseDocument.Parse(filestream);
foo fooexample = new foo();
foreach (var object in exceldata)
{
    fooexample.id = object.id;
    fooexample.bar = new bar({id = object.bar.id});
}

Или используя коллекцию

Класс foo

public class foo 
{     
    public int id { get; set; }
    public string name { get; set; } 
    public ICollection<bar> bar { get; set; }
}

Добавление объектов из другого объекта

exceldata = ParseDocument.Parse(filestream);
foo fooexample = new foo();
fooexample.bar = new List<bar>();
foreach (var object in exceldata)
{
    fooexample.id = object.id;
    fooexample.bar.Add(new bar({id = object.bar.id}));
}

Как отмечали другие, вы можете в качестве альтернативы инициализировать список в классе 'foo'.

Другие вопросы по теме