将相同的随机值重复插入C#中

时间:2018-10-11 13:11:59

标签: c# dictionary for-loop

这可能很愚蠢,但我对此感到困惑。我有一个带有默认值属性的列表。我要做的是使用随机值更新列表中的属性,然后将包含新值的列表存储在Dictionary中。字典的键是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 :(得分:2)

当您将相同的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

答案 1 :(得分:1)

您只有两个TestClass实例,并且已将对这两个实例的引用添加到字典中的每个条目。当TestClass的一个实例的属性更新时,对该TestClass实例的所有引用将看到相同的值。

numbers循环中,创建TestClass的新实例并查看您的预期行为:

testList = new List<TestClass> {
   new TestClass { test = random.NextDouble() },
   new TestClass { test = random.NextDouble() }
}
testAllYearsList.Add(year - number, testList);

答案 2 :(得分:0)

终于让它开始工作了。这是我更改的内容:

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中。

非常感谢那些花时间帮助的人。没有这些想法,我将无法正常工作。