3

我有一个列表列表,我想添加面向列的值。就像在下面的代码示例中一样:

Data = new List<List<double>>();
for (int i = 0; i < columnCount; i++)
        {
            for (int j = 0; j < rowCount; j++)
            {
                Data[j][i] = (probabilityList[j]) * K); // It won't work
            }
        }

我知道它不会起作用,因为在当前情况下不存在 Data 的索引,我需要使用 add() 方法。

但是,我需要将值添加到以列开头的列表:

[1   , null] ----> [1, null]
[null, null]       [2, null]

如何将值添加到以列开头的列表列表?

4

5 回答 5

2

您需要创建放置在外部列表列表中的实际列表:

for (int i = 0; i < rowCount; i++)
{
    Data.Add(new List<double>());
}

创建所有内部列表后,您可以浏览它们并向它们添加值:

for (int i = 0; i < columnCount; i++)
{
    for (int j = 0; j < rowCount; j++)
    {
        Data[j].Add((probabilityList[j]) * K);
    }
}
于 2013-01-04T22:19:04.393 回答
1

您需要new向上列表列表的每个元素

Data = new List<List<double>>();
for (int i = 0; i < columnCount; i++)
{
  List<double> column = new List<double>();
  for (int j = 0; j < rowCount; j++)
  {
    //not really sure if this is the correct code here
    //that would depend on your logic
    column.Add((probabilityList[j]) * K); 
  }
  Data.Add(column);
}

列表不是数组。它没有您只需将元素放入的插槽,它更像是一条链。

所以最初你有一个List<List<double>>空的,它没有List<double>实例。您必须(明确)创建这些列表并将其添加到Data列表中。

或者,如果您确实需要带有元素插槽的行和列,则可以使用二维矩阵,如下所示:

var matrixData = new double[rowCount, columnCount];
for (int i = 0; i < columnCount; i++)
{
  for (int j = 0; j < rowCount; j++)
  {
    matrixData[j, i] = ((probabilityList[j]) * K); 
  }
}
于 2013-01-04T22:01:25.890 回答
1

由于您知道所需的列数和行数,您可能会考虑使用数组而不是列表。当一个数组被初始化时,数组的所有成员都被初始化为它们的默认值。这将使您的代码

double[,] Data = new double[columnCount,rowCount];
for (int i = 0; i < columnCount - 1; i++)
    {
        for (int j = 0; j < rowCount - 1; j++)
        {
            Data[j,i] = (probabilityList[j]) * K); 
        }
    }
于 2013-01-04T22:17:55.590 回答
0

简而言之:您必须初始化List<T>父集合内部的每个List<T> 集合。

您可能知道,集合的初始化是通过new.NET Framework 中的 throw 关键字完成的。否则,所有内部列表都将是Null并且您将无法访问它们。

我已将此概念应用于您的代码。

var mainData = new List<List<double>>();
for (int i = 0; i < columnCount; i++)
{
  var innerList = new List<double>();
  for (int j = 0; j < rowCount; j++)
  {
    innerList.Add((probabilityList[j]) * K); 
  }
  mainData.Add(innerList);
}
于 2013-01-04T22:03:02.630 回答
0

用一行代码初始化列表列表 (List<List<T>>) 的一种流行方法是使用 LINQ,如下所示:

List<List<double>> Data = Enumerable.Range(0, columnCount).Select(i => new List<double>()).ToList();

这将生成一个空的已初始化双精度列表的列表。从这里每个内部列表都可以作为 Data[i] 访问,并且可以将元素作为 Data[i].Add(double) 添加到其中。

以下是 LINQ 方法初始化 List<List<double>>

  1. Enumerable.Range(0, columnCount)

返回具有 columnCount 成员数的 Int 的 IEnumerable 集合。

  1. .Select(i => new List<double>())

对于上一步返回的集合的每个元素,运行一个函数“new List()”并将输出(初始化的 double 的空 List)存储在 IEnumerable 集合中(所以我们得到 IEnumerable<List<double>> 的 columnCount 数量为成员)。

  1. .ToList();

将上述步骤 IEnumerable<List<double>> 中的集合转换为 List<List<double> - 所需的输出。

于 2021-03-18T13:47:31.407 回答