foreach和index in .ToDictionary C#

时间:2018-05-17 14:03:17

标签: c# json lambda web-scraping todictionary

我正在使用c#newtonsoft.Json来搜索某些数据并尝试将抓取的数据写入json文件

我在.ToDictionary函数中编写foreach时遇到困难,而且无法将++编译成我的.ToDictionary函数。

评论的代码显示了我想要做的事情。

提前致谢。

我的班级:

public class JsonParametersData
{
    public bool required { get; set; }
    public bool list { get; set; }
    public List<string> options { get; set; }
}

我的阵列

var jsonData              = new List<Dictionary<string, Dictionary<string, JsonParametersData>>>();
var moduleParameters      = new List<string>();
var parameterOptionsArray = new List<List<string>>();
var parameterOptions      = new List<string>();
var requiredArray         = new List<bool>();
var listArray             = new List<bool>();
string moduleName         = item.Attributes["href"].Value.Replace("_module.html", "");

评论的代码显示了我要做的事情。

int index = 0;
jsonData.Add(new Dictionary<string, Dictionary<string, JsonParametersData>>()
{
    {
        moduleName,
        moduleParameters
            .ToDictionary(n => n,
                n => new JsonParametersData
                {
                    required = requiredArray[index],
                    list = listArray[index],
                    options = new List<string>() { "option1", "option2" },
                   /*
                    foreach (var parameteroption in parameterOptionsArray[index])
                    {
                        options.Add(parameteroption);
                    }
                    index++;
                    */
                })
    }
});

string json = JsonConvert.SerializeObject(jsonData.ToArray());

//write string to file
System.IO.File.WriteAllText(@"path", json);

3 个答案:

答案 0 :(得分:2)

您的parameterOptionsArray不是数组,而是列表列表。

问题是 parameterOptionsArray [index] 是一个List,而不是一个字符串。所以你应该使用AddRange()而不是Add()。

parameterOptionsArray.Foreach(parameteroption => options.AddRange(parameteroption));

答案 1 :(得分:1)

正如我在评论中所写,您只能在对象初始化程序中进行分配。因此,允许以下内容:

var a = new { MyMember = anInstance }

虽然这不是:

var a = new { MyMember = anInstance, anInstance.DoSomething() };

这是你根本不应该使用Linq的情况之一,因为它会导致更多的混乱而不是它的帮助。而是使用一个好的旧式循环:

int index = 0;
var innerDict = new Dictionary<string, JsonParametersData>();

foreach(var name in moduleParameters)
{
    innerDict[name] = new JsonParametersData
                {
                    required = requiredArray[index],
                    list = listArray[index],
                    options = new List<string>() { "option1", "option2" },
                } 
    innerDict[name].Options.AddRange(parameterOptionsArray[index]);
    index++;
}

var dict = new Dictionary<string, Dictionary<string, JsonParametersData>>();
dict[moduleName] = innerDict;
jsonData.Add(dict);
string json = JsonConvert.SerializeObject(jsonData.ToArray());

答案 2 :(得分:0)

您似乎在parameterOptionsArray中有一个锯齿状数组。您可以在此处使用SelectMany。也许以下示例可以提供帮助:

    string[][] parameterOptionsArray = new string[2][];
    parameterOptionsArray[0] = new string[2];
    parameterOptionsArray[0][0] = "1";
    parameterOptionsArray[0][1] = "2";
    parameterOptionsArray[1] = new string[2];
    parameterOptionsArray[1][0] = "3";
    parameterOptionsArray[1][1] = "4";

    var testing = new {options = parameterOptionsArray.SelectMany(x => x).ToList()};        
    testing.options.ForEach(x => Console.WriteLine(x));