如何初始化List of List呢?同列

本文关键字:List 同列 of 初始化 | 更新日期: 2023-09-27 17:50:39

我有一个列表列表,我想添加面向列的值。如以下代码样例所示:

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
            }
        }

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

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

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

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

如何初始化List of List呢?同列

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

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);
    }
}

既然您知道所需的列数和行数,您可能会考虑使用数组而不是列表。初始化数组时,数组的所有成员都初始化为其默认值。这将使您的代码

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); 
        }
    }

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

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

这将产生一个由空的初始化的double类型列表组成的列表。从这里,每个内部列表都可以作为Data[i]访问,并且可以作为Data[i]添加元素。add (double)

下面是LINQ方法初始化List

  1. Enumerable.Range(0, columnCount)

返回IEnumerable Int集合,包含columnCount成员个数。

  • .Select(i => new List<double>())
  • 对于上一步返回的集合中的每个元素运行一个函数"new List()"并将输出(初始化为double类型的空列表)存储在IEnumerable集合中(因此我们得到IEnumerable>

  • .ToList();
  • 转换上面步骤中的集合IEnumerable>List-所需输出

    您需要对List of Lists的每个元素进行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<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); 
      }
    }
    

    总之:您必须初始化在父List<T>集合内的List<T>的每个集合。

    你可能知道,在。net框架中,集合的初始化是通过关键字new完成的。否则,所有的内部列表将是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);
    }