2

我有一个嵌套列表,我需要他来填充从函数返回的值。类似于二维矩阵,其中行数等于一个列表的长度,而列数等于另一个列表的长度。问题是如何调用嵌套列表元素的索引?

List<int> wordids;
List<int> hiddenids;
List<List<int>> inputWeights;

foreach (var wordid in wordids)
{
    foreach (var hiddeid in hiddenids)
    {
         inputWeights[wordid][hiddenid] = GetStrength(wordid, hiddenid);
    }
}

PS对不起我的英语不好。

4

4 回答 4

4

您需要在输入权重中添加列表:

使用外部foreach外部和内部for循环:

var inputWeights = new List<List<int>>();

foreach (int wordid in wordids)
{
    var currentRow = new List<int>();

    for (int i = 0; i < hiddenids.Count; ++i)
        currentRow.Add(GetStrength(wordid, hiddenids[i]));

    inputWeights.Add(currentRow);
}

使用两个foreach循环(这是我的首选解决方案,但意见可能不同!):

var inputWeights = new List<List<int>>();

foreach (int wordid in wordids)
{
    var currentRow = new List<int>();

    foreach (int hiddenid in hiddenids)
        currentRow.Add(GetStrength(wordid, hiddenid));

    inputWeights.Add(currentRow);
}

或者使用 Linq 而不是内部循环:

foreach (int wordid in wordids)
{
    var currentRow = new List<int>();
    currentRow.AddRange(hiddenids.Select(hiddenid => GetStrength(wordid, hiddenid)));
    inputWeights.Add(currentRow);
}

甚至对整个事情都使用 Linq(现在变得难以理解;):

var inputWeights = wordids.Select(
    wordid => new List<int>(hiddenids.Select(hiddenid => GetStrength(wordid, hiddenid)))
).ToList();

为了真正完整,这里有一个使用 Linq Query Syntax 的解决方案(是的,我花了太多时间在这个问题上,但一旦开始我就无法停止......;)

var inputWeights = (from wordid in wordids
                    select (from hiddenid in hiddenids
                            select GetStrength(wordid, hiddenid)).ToList()).ToList();

这一切都假设您确实想要 (#wordids * #hiddenids) 在结果中!这是真的吗?

例如,如果您有 10 个 wordid 和 5 个 hiddenid,则输出将总共有 50 个项目。

于 2013-04-16T13:41:25.283 回答
1

使用二维数组或交错数组

int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[] { 1, 3, 5, 7, 9 };
jaggedArray[1] = new int[] { 0, 2, 4, 6 };
jaggedArray[2] = new int[] { 11, 22 };

a=jaggedArray[0][1];  //a=3;
于 2013-04-16T13:39:08.960 回答
1

在您的特定情况下,您不应该使用foreach,而应该使用通常的for-loop,例如

List<int> wordids;
List<int> hiddenids;
List<List<int>> inputWeights;

wordids = new List<int>();
hiddenids = new List<int>();
inputWeights = new List<List<int>>();

//add values to your List-objects

foreach (int i = 0; i < wordids.Length; i++)
{
    foreach (int j = 0; j < hiddenids.Length; j++)
    {
         inputWeights[i][j] = GetStrength(wordids[i], hiddenids[j]);
    }
}
于 2013-04-16T13:41:42.173 回答
0
List<List<int>> inputWeights=new List<List<int>>();

 for (var i = 1; wordids.Count > i; ++i)
 {
   for (var h = 1; hiddenids.Count > h; ++h)
   {
    inputWeights[i-1][h-1] = GetStrength(wordids[i-1], hiddenids[h-1]);
   }
 }
于 2013-04-16T13:48:28.267 回答