Как получить доступ к данным многоэлементного списка, хранящимся в классе publi c? - PullRequest
0 голосов
/ 13 апреля 2020

Мой первый вопрос по SO:

Я создал этот класс publi c, чтобы я мог хранить три элемента в списке:

public class myMultiElementList
{
   public string Role {get;set;}
   public string Country {get;set;}
   public int Commonality {get;set;}
}

В моем основном классе я затем создал новый список, используя этот процесс:

var EmployeeRolesCountry = new List<myMultiElementList>();   
                    var rc1 = new myMultiElementList();
                    rc1.Role = token.Trim();
                    rc1.Country = country.Trim();
                    rc1.Commonality = 1;
                    EmployeeRolesCountry.Add(rc1);

Я добавил данные в EmployeeRolesCountry и проверил, что имеет 472 строки. Однако, когда я пытаюсь получить его, как показано ниже, мой ForEach l oop извлекает только последнюю строку, добавленную в список, 472 раза ...

foreach (myMultiElementList tmpClass in EmployeeRolesCountry)
                  {
                      string d1Value = tmpClass.Role;
                      Console.WriteLine(d1Value);
                      string d2Value = tmpClass.Role;
                      Console.WriteLine(d2Value);
                      int d3Value = tmpClass.Commonality;
                      Console.WriteLine(d3Value);
                  }

Это было самым многообещающим из возможных решений Я нашел здесь, так что любые указатели очень ценятся.

РЕДАКТИРОВАТЬ: добавление данных в EmployeeRolesCountry

        /*
        Before this starts, data is taken in via a csvReader function and parsed
        All of the process below is concerned with two fields in the csv
        One is simply the Country. No processing necessary
        The other is bio, and this itself needs to be parsed and cleansed several times to take roles out
        To keep things making sense, I've taken much of the cleansing out       
        */


private void File_upload_Click(object sender, EventArgs e)
     {      

        int pos = 0;
        var EmployeeRolesCountry = new List<myMultiElementList>();   
        var rc1 = new myMultiElementList();
        int a = 0;

        delimiter = ".";

        string token;

        foreach (var line in records.Take(100))
            {   
                    var fields = line.ToList(); 
                    string bio = fields[5];
                    string country = fields[4]; 
                    int role_count = Regex.Matches(bio, delimiter).Count;
                    a = bio.Length;             

                for (var i = 0; i < role_count; i++)
                            {


                            //here I take first role, by parsing on delimiter, then push back EmployeeRolesCountry with result
                            pos = bio.IndexOf('.');
                            if (pos != -1)
                            {
                                token = bio.Substring(0, pos);
                                string original_token = token;


                                rc1.Role = token.Trim();                            
                                rc1.Country = country.Trim();
                                rc1.Commonality = 1;

                                EmployeeRolesCountry.Add(rc1);

                                a = original_token.Length;
                                bio = bio.Remove(0, a + 1);                              

                               }


                            }                       

            }              
    }             

1 Ответ

0 голосов
/ 13 апреля 2020

РЕДАКТИРОВАТЬ:

Когда сгруппированы по нескольким свойствам, мы перебираем сгруппированные элементы:

var employeesGroupedByRolwAndCountry = EmployeeRolesCountry.GroupBy(x => new { x.Role, x.Country });

employeesGroupedByRolwAndCountry.ToList().ForEach
(
    (countryAndRole) =>
    {
        Console.WriteLine("Group {0}/{1}", countryAndRole.Key.Country, countryAndRole.Key.Role);
        countryAndRole.ToList().ForEach
        (
            (multiElement) => Console.WriteLine("    : {0}", multiElement.Commonality)
        );
    }
);

__ ORIGINAL POST __

Вы создаете экземпляр rc1 только один раз (за пределами l oop) и добавьте тот же экземпляр в список.

Пожалуйста, убедитесь, что вы делаете

var rc1 = new myMultiElementList();

внутри l oop, где вы добавляются элементы, а не снаружи.

Все ссылки одинаковы в вашем случае:

var obj = new myObj();
for(i = 0; i < 5; i++)
{
    obj.Prop1 = "Prop" + i;
    list.Add(obj);
}

теперь список состоит из 5 элементов, все из которых указывают на объект (тот же экземпляр, один и тот же объект в памяти), и когда вы делаете

obj.Prop1 = "Prop" + 5

, вы обновляете тот же адрес памяти, и все указатели в списке указывают на один и тот же экземпляр, поэтому вы не получаете 472 копии LAST предмет, но получая один и тот же экземпляр 472 раза.

Решение простое. Создавайте новый экземпляр каждый раз, когда добавляете в свой список:

for(i = 0; i < 5; i++)
{
    var obj = new myObj();
    obj.Prop1 = "Prop" + i;
    list.Add(obj);
}

Надеюсь, это поможет.

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