添加两个列表<十进制[]>类型的单个元素



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++)
{
}

相关内容

最新更新