Те же случайные значения вставляются в коллекцию повторно C # - PullRequest
0 голосов
/ 11 октября 2018

Это может быть глупо, но я застрял на этом.У меня есть список со свойством, которое имеет значение по умолчанию.Что я сделаю, так это обновлю свойство в списке, используя случайное значение, а затем сохраню список с новыми значениями в Словаре.Ключ словаря - int, представляющий год, а значение - список.Проблема только в том, что последний набор случайных значений хранится в словаре.Пожалуйста, проверьте мой код

public static void Main()
{
    List<int> numbers = new List<int>(){ 0, 1, 2, 3 ,4};
    Dictionary<int, List<TestClass>> testAllYearsList = new Dictionary<int, List<TestClass>>();
    int year = 2018;
    var random = new Random();

    List<TestClass> testList = new List<TestClass>();

    testList = db;//assuming the values here are fetched from db

    foreach(var number in numbers){

        testList.ForEach(x => {
            x.test = random.NextDouble();
        });
        testAllYearsList.Add(year - number, testList);

    }

    foreach(KeyValuePair<int, List<TestClass>> entry in testAllYearsList)
    {
            foreach(var xx in entry.Value){
                Console.WriteLine(entry.Key + "-------" + xx.test);
            }
    }
}
public class TestClass{
    public string name{get;set;}
    public double test{get;set;}
}

Приведенные выше результаты кода выглядят следующим образом:

2018-------0.702259658231521
2018-------0.517733022811698
2017-------0.702259658231521
2017-------0.517733022811698
2016-------0.702259658231521
2016-------0.517733022811698
2015-------0.702259658231521
2015-------0.517733022811698
2014-------0.702259658231521
2014-------0.517733022811698

То, что я ожидаю, выглядит примерно так:

2018-------0.232323558231521
2018-------0.679072365236698
2017-------0.702259658231545
2017-------0.834268732412351
2016-------0.465468889231561
2016-------0.323423456811698
2015-------0.125332658231528
2015-------0.347588566678699
2014-------0.734758565656521
2014-------0.854544444571690

ОБНОВЛЕНИЕЯ попробовал это, но все равно у меня та же проблема.

foreach(var number in numbers){
    var newTestList = new List<TestClass>();
    foreach(var xx in testList){
    newTestList.Add(xx);        
    }
    newTestList.ForEach(x => {
        x.test = random.NextDouble();
    });
    testAllYearsList.Add(year - number, newTestList);

}

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

У вас есть только два экземпляра TestClass, вы добавили ссылки на эти два экземпляра для каждой записи в словаре.Когда один экземпляр TestClass обновил свое свойство, все ссылки на этот экземпляр TestClass увидят то же значение.

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

testList = new List<TestClass> {
   new TestClass { test = random.NextDouble() },
   new TestClass { test = random.NextDouble() }
}
testAllYearsList.Add(year - number, testList);
0 голосов
/ 11 октября 2018

Наконец-то все заработало.Вот что я изменил:

foreach (var number in numbers)
        {
            var newTestList = new List<TestClass>();
            foreach (var xx in testList)
            {
                newTestList.Add(new TestClass
                {
                    name = xx.name,
                    test = xx.test
                });
            }
            newTestList.ForEach(x => {
                x.test = random.NextDouble();
            });
            testAllYearsList.Add(year - number, newTestList);

        }

Таким образом, добавление xx непосредственно к newTestList не решит проблему.Вместо этого мне нужно создать новый TestClass, отобразить значения из xx, а затем добавить его в newTestList.

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

0 голосов
/ 11 октября 2018

Когда вы используете те же testList с теми же TestClass объектами, которые добавляете ссылки на одни и те же объекты к testAllYearsList, одним из возможных способов исправить это было бы добавление новогоtestList с новыми объектами каждый раз:

static void Main(string[] args) {
    List<int> numbers = new List<int>() { 0, 1, 2, 3, 4 };
    Dictionary<int, List<TestClass>> testAllYearsList = new Dictionary<int, List<TestClass>>();
    int year = 2018;
    var random = new Random();

    foreach (var number in numbers) {
        List<TestClass> testList = new List<TestClass> {
            new TestClass { test = 0.2 },
            new TestClass { test = 1.5 }
        };
        testList.ForEach(x => {
            x.test = random.NextDouble();
        });
        testAllYearsList.Add(year - number, testList);

    }

    foreach (KeyValuePair<int, List<TestClass>> entry in testAllYearsList) {
        foreach (var xx in entry.Value) {
            Console.WriteLine(entry.Key + "-------" + xx.test);
        }
    }
}

Пример вывода:

2018-------0.961755354405267
2018-------0.285138806926617
2017-------0.249302806914459
2017-------0.68261938015121
2016-------0.998315326403042
2016-------0.692115324871668
2015-------0.822671521838136
2015-------0.0111894570343147
2014-------0.745275680788455
2014-------0.0539408922446616
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...