【问题标题】:foreach and index in .ToDictionary C#.ToDictionary C# 中的 foreach 和索引
【发布时间】:2018-05-17 14:03:16
【问题描述】:

我正在网络抓取一些数据并尝试使用 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);

【问题讨论】:

  • 您只能在对象初始化器中进行赋值(这就是 new { ... } 的名称)。但是,您可以在初始化字典时添加选项。
  • 你会怎么做?你能给我一个例子吗?

标签: c# json web-scraping lambda


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    正如我在 cmets 中所写的,您只能在对象初始化器中进行赋值。因此允许以下情况:

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

    【讨论】:

    • 索引怎么样?无论如何在我的 JsonParametersData 中 ++ing?
    • 在新的 JsonParametersData 我的requiredArray[ownIndex] 需要它自己的索引。最后,在关闭 JsonParametersData 之前,新的索引需要 ++。有什么简单的方法吗?感谢您的帮助。
    • @ChakirBelhaj 我不明白“关闭 JsonParametersData”是什么意思。在您的示例中,当您的循环结束时,索引应该增加。据我了解,这应该为每个JsonParametersData 执行一次,不应该吗?
    • 当索引仍为 0 时,代码现在会创建 all JsonParametersData。我希望为每个创建的新 JsonParametersData,index++。这意味着在创建新的 JsonParametersData 时,索引应该增加。我希望这能解释问题。
    • 正是我需要的,连我的教授都帮不了我。非常感谢。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 2011-02-28
      • 2014-09-12
      相关资源
      最近更新 更多