1

我正在尝试使用以下代码将列表列表映射到字典列表中,但出现错误

索引超出范围

更新了问题

List<List<string>> _terms = new List<List<string>>();
for (int i = 0; i < _numcats; ++i)
{
    _terms.Add( GenerateTerms(_docs[i]));
}
// where _docs[i] is an array element 
// and the procedure GenerateTerms returns list  

int j = 0;
foreach (List <string> catterms in _terms)
{
    for (int i = 0; i < catterms.Count; i++)
    {
        _wordsIndex[j].Add(catterms[i], i);
    }
    j ++;            
}

请问有什么帮助吗?

4

2 回答 2

2

假设:

  • _terms是类型List<List<string>>
  • _wordsIndex是类型List<Dictionary<string,int>>

试试这个:

var _wordsIndex = 
    _terms.Select(listOfWords => 
        // for each list of words
        listOfWords
            // each word => pair of (word, index)
            .Select((word, wordIndex) => 
                   new KeyValuePair<string,int>(word, wordIndex))
            // to dictionary these
            .ToDictionary(kvp => kvp.Key, kvp => kvp.Value))
        // Finally, ToList the resulting dictionaries
        .ToList();

但是,请注意 - 您的示例代码中也存在此错误:调用Add已存在该键的字典是禁忌。为了确保这里的安全,您可能希望获得一个Distinct()键值对。

于 2012-11-28T20:14:31.813 回答
1

我假设 _wordsIndex 是List<Dictionary<string, int>>. 如果是这样,您可能正在尝试访问尚未添加的项目。所以你需要把它改成这样:

foreach (List <string> catterms in _terms)
{
    var newDict = new Dictionary<string, int>();
    for (int i = 0; i < catterms.Count; i++)
    {
        newDict.Add(catterms[i], i);
    }
    _wordsIndex.Add(newDict)
}

请注意,字典是在内循环之前创建的,在内循环中填充,然后在内循环结束后添加到主列表中。

于 2012-11-28T20:00:25.590 回答