foreach и индекс в .ToDictionary C # - PullRequest
0 голосов
/ 17 мая 2018

Я перебираю некоторые данные и пытаюсь записать очищенные данные в файл json, используя c # newtonsoft.Json

Я застреваю при записи foreach в моей функции .ToDictionary, а также не могу ++ индекс в моей функции .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 голосов
/ 17 мая 2018

Как я уже писал в комментариях, вы можете делать только назначения в инициализаторе объекта. Таким образом, допускается следующее:

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());
0 голосов
/ 17 мая 2018

Похоже, у вас есть зубчатый массив в 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));
0 голосов
/ 17 мая 2018

Ваш параметрOptionsArray - это не массив, а список списков.

Дело в том, что parameterOptionsArray [index] является списком, а не строкой. Поэтому вы должны использовать AddRange () вместо Add ().

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