i创建了一种类型List<decimal[]>
的扩展方法,该方法可以添加元素。该方法如下:
public static void ElementAddition(this List<decimal[]> thisList, List<decimal[]> listToAdd)
{
if (thisList.Count == 0) return;
for (var i = 0; i < thisList.Count; i++)
{
for (var j = 0; j < thisList[0].Length; j++)
{
thisList[i][j] += listToAdd[i][j];
}
}
}
这有一些有趣的结果。每当thisList[i][j] += listToAdd[i][j];
行执行时,它将一个列表中的所有元素添加到另一个列表中。因此,我最终的thisList
最终比应该大得多。正如我所期望的那样,它不会在元素上增加。
我努力在Stackoverflow上找到类似的问题,因此任何指针都会有用。我显然不了解有关列表的实施的知识吗?
保罗
编辑:以下单元测试:
[Test]
public void ElementAddition_WhenCalled_CorrectlyAddIndividualElements()
{
var decListOne = new decimal[] {1, 2, 3, 4};
var decListTwo = new decimal[] {10, 20, 30, 40};
var listListOne = new List<decimal[]>();
var listListTwo = new List<decimal[]>();
for (var i = 0; i < 3; i++)
{
listListOne.Add(decListOne);
listListTwo.Add(decListTwo);
}
listListOne.ElementAddition(listListTwo);
Assert.AreEqual(11m,listListOne[0][0]);
}
提供此输出:
Expected: 11m
But was: 31m
您在测试中重复使用相同的数组:
for (var i = 0; i < 3; i++)
{
listListOne.Add(decListOne); //here's the problem
listListTwo.Add(decListTwo);
}
这意味着在您的ElementAddition
中,您将元素添加到每个循环上的同一集合中。thisList
的每个条目都引用不同数组的假设是不正确的。
如果您更改测试以确保每个数组唯一/不同:
for (var i = 0; i < 3; i++)
{
listListOne.Add(decListOne.ToArray()); //force new/different instances of the array
listListTwo.Add(decListTwo);
}
然后您将获得您期望的结果。
更改以下:
for (var j = 0; j < thisList[0].Length; j++)
{
}
to:
for (var j = 0; j < thisList[i].Length; j++)
{
}