Как напечатать ключ словаря и умножить значения для этого ключа в той же строке в C # - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть клиент ниже для приложения Web Api, внутри этого клиента у меня есть словарь с несколькими зависимостями.Я хотел бы напечатать в файл журнала строку с ключом и несколькими значениями.так как словарь находится в отдельном классе, я не могу достичь значений правильно.Это входные данные:

 [{
    "Inputs": [{
        "Input": "A B C"
    }, {
        "Input": "B C E "
    }, {
        "Input": "C G"
    }, {
        "Input": "D A  F"
    }, {
        "Input": "E F"
    }, {
        "Input": "F H "
    }]
}] 

это мой класс DataReader, где словарь:

public class DataReader
    {
        public Dictionary<char, char[]> Read()
        {
            JArray data;

            using (StreamReader sr = new StreamReader(@"C:input.json"))
            {
                data = (JArray)JToken.ReadFrom(new JsonTextReader(sr));
            }

            var values = data.SelectTokens("..Input").Select(x => x.ToString()).ToArray();
            var dict = values.ToDictionary(s => s[0], v => v.Substring(2).Where(Char.IsLetter).ToArray());

            IEnumerable<char> Dependencies(char input)
            {
                yield return input;
                if (dict.TryGetValue(input, out char[] childDepends))
                {
                    foreach (char result in childDepends.SelectMany(Dependencies))
                    {
                        yield return result;
                    }
                }
            }

            foreach (char s in values.Select(x => x[0]))
            {
                Console.Write(s); Console.Write(" ");
                //the line below calls the IEnumerable Dependencies:

                Console.WriteLine(String.Join(" ", dict[s].SelectMany(Dependencies).Distinct().OrderBy(x => x)));
            }
            return dict;

это мой класс program.cs, где мне нужно вызвать словарь и распечататьзначения:

class Program : ApiController
{

    static void Main(string[] args)
    {
        RunAsync().Wait();
        Console.ReadLine();
    }

    DataReader reader;
    public Program()
    {
        reader = new DataReader();
    }

    static async Task RunAsync()
    {
        DataReader reader = new DataReader();
        var data = reader.Read();
        foreach (var key in data.Keys)
        {
            foreach (var s in data.Values)
            {
                //assembly of values to send
                var transactionId = Guid.NewGuid();
                string userName = "test";
               string message = string.Join(" ", "<< Dependencies for", key, ">>",s[0]);                 
                 // write the file here 
                var logLine = string.Join(",", transactionId, message);

                using (StreamWriter writer = File.AppendText(@"C:\log.txt"))
                {
                    writer.WriteLine(logLine);
                }
                var client = new HttpClient();
                client.BaseAddress = new Uri("http://localhost:56047/");
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                var payload = new ProcessorDto();
                payload.UserName = userName;
                payload.Message = message;
                var result = await client.PostAsync("api/validate", payload, new JsonMediaTypeFormatter());
                var responseData = await result.Content.ReadAsStringAsync();
                // update log with response:
                var fileText = File.ReadAllText(@"log.txt");
                var updatedLine = logLine + "," + responseData;
                fileText = fileText.Replace(logLine, updatedLine);
                File.WriteAllText(@"C:\log.txt", fileText);
            }
        }
    }
}

приведенный выше код выводит на консоль приведенный ниже код:

A   B C E F G H
B   C E F G H
C   G
D   A B C E F G H
E   F H
F   H

эту часть моего кода необходимо изменить, так как он неправильно записывает файл log.txt:

string message = string.Join(" ", "<< Dependencies for", key, ">>",s[0]);

Я не уверен, что добавить к s [0], так как он возвращает следующее:

23b3c058-8ec0-4925-9e42-ae5de2863ca7, << Зависимостидля A >> B, «Неверно»

c5f778d8-6eac-4508-b01f-864f4a49f57a, << Зависимости для A >> C, «Неверно»

8d5821b3-2f68-40fd-a18c-473d6aa222ad, << Зависимости для A >> G, «Ложь»

8e693ea8-e97b-4e6a-831b-c0348d918e29, << Зависимости для A >> A, «Ложь»

af7a4497-8c18-401b-b287-b05abb94f5e8, << Зависимости для A >> F, «Ложь»

ecad1901-c503-488a-a5f2-6ec04d5ac7a9, << Зависимости для A >> H, «Ложь» 50d4edb9-770b-4c6d-be54-9f738cde6dd1, << Зависимости для B >> C, «Ложь»

208c8ae4-e669-4f06-8548-c1035c22ff61, << Зависимости для B >> G, «Ложь»

e001b386-02c0-4111-a715-c4d524074be4, << Зависимости для B >> A, «Ложь»

19fbe253-284b-4221-a762-e2eedb9b2d73, << Зависимости для B >> F, «Ложь»

e100ce7f-be94-4fc5-a592-f4088a031b6d, << Зависимости для B >> H, «Ложь»

e645a38c-a33d-428d-90be-d6f34d27c935, << Зависимости для C >> B, «Ложь»

07031b1a-8546-4f9e-8f49-78a6d8ef1bfa, << Зависимости для C >> C, «Ложь»

3d9de182-9c32-4716-bff9-0840c176cec6, << Зависимости для C >> G, "False "

623c4529-b025-4e4d-abb3-98ea21e40381, << Зависимости для C >> A," False "

ee46a0ae-2518-4848-9d87-9fb554d527de, << Зависимости для C>> F, «Ложь»

a0769061-2c72-44cd-a174-ee11766bb920, << Зависимости для C >> H, «Ложь»

311be8b8-93fe-420d-b0ae-6b74af3291e2, <<Зависимости для D >> B, «False»

f7304991-51fc-42b1-bd31-749c6fde77d3, << Depenзначения для D >> C, «Ложь»

c59163c8-d4bb-4720-845c-2e1111d2cde5, << Зависимости для D >> G, «Ложь»

cd7869bf-5427-470e-a064-6bc785867eb3, << Зависимости для D >> A, «Ложь»

7f96e0cf-764e-4803-a70a-b28e8da8f85e, << Зависимости для D >> F, «Ложь»

65c5ac2f-22eb-4e84-9b8d-35c1e0e4d862, << Зависимости для D >> H, «Ложь»

0ffeaad0-1626-43b3-9e45-050d62023e69, << Зависимости для E >> B, «Ложь»

3a7e2625-4e27-4f33-af11-c75fb7568560, << Зависимости для E >> C, «Ложь»

cb9f2d26-bd62-4200-a7aa-74190d124389, << Зависимости для E >> G, «Ложь»

6e063ec1-c82d-4a84-85f1-2f8baba281c6, << Зависимости для E >> A, «Ложь»

63895dc3-de7b-42f6-b0e3-fdc429ae5fc3, << Зависимости для >> >>, FFalse "

a1626f22-b476-4d00-a08c-aab08b07e5ef, << Зависимости для E >> H," False "

faa2dc3c-3303-46d0-8f68-2ac1272504d1, << Зависимости дляF>> B, "Ложь"

031e5115-30ed-4ada-9db2-729df8dd7897, << Зависимости для F >> C,«Ложь»

90577a7a-cc12-4a57-a9de-97b93b59398f, << Зависимости для F >> G, «Ложь»

2b668cb0-5d6a-4b7c-8326-c8cf39436bbf, << Зависимости>> A, "Ложь"

c15b1c49-534f-40e6-8f10-c16cd66a6cb2, << Зависимости для F >> F, "Ложь"

4aabfcc0-dfc7-45a2-b346-e7fade4f48ff,<< Зависимости для F >> H, «Ложь»

, но должно быть так:

23b3c058-8ec0-4925-9e42-ae5de2863ca7, << Зависимости для A >> B, C, E, F, G, H, "Ложь"23b3c058-8ec0-4925-9e42-ae5de2863ca7, << Зависимости для B >> C, E, F, G, H «False» 23b3c058-8ec0-4925-9e42-ae5de2863ca7, << Зависимости для C >> G «False»23b3c058-8ec0-4925-9e42-ae5de2863ca7, << Зависимости для D >> A, B, C, E, F, G, H «Неверно» 23b3c058-8ec0-4925-9e42-ae5de2863ca7, << Зависимости для E >>F, H «Ложь» 23b3c058-8ec0-4925-9e42-ae5de2863ca7, << Зависимости для F >> H «Ложь»

Что следует добавить к приведенному ниже коду для печати правильного вывода

string message = string.Join ("", "<< Зависимости для", ключ, ">>", s [0]);

1 Ответ

0 голосов
/ 05 февраля 2019

Вложенные циклы foreach не нужны. Итерация словаря дает вам KeyValuePair .Попробуйте использовать это для доступа к ключу и значению (в вашем случае, 'char' и 'char []'), например так:

        foreach (var kvp in data)
        {
            //assembly of values to send
            var transactionId = Guid.NewGuid();
            var userName = "test";

            var message = $"{transactionId},<< Dependencies for {kvp.Key}>>" + string.Join(",", kvp.Value);

            // your other stuff here
        }

РЕДАКТИРОВАТЬ: Хорошо, вот рабочее приложение консоли, демонстрирующеерекурсивное решение:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json.Linq;

namespace ConsoleApp1
{
   internal class Program
   {
      #region Static Fields and Constants

      private static readonly string json =
         "[" +
         "{\"Inputs\": [" +
         "{\"Input\": \"A B C\"}," +
         "{\"Input\": \"B C E \"}," +
         "{\"Input\": \"C G\"}," +
         "{\"Input\": \"D A  F\"}," +
         "{\"Input\": \"E F\"}," +
         "{\"Input\": \"F H \"}" +
         "]}" +
         "]";

      #endregion

      #region Public Methods

      public static void GetDependencies(char key, Dictionary<char, char[]> inputs, ref List<char> totalDependencies)
      {
         // stopping cases (the stack will unwind when all dependencies have been explored)
         if (!inputs.ContainsKey(key) || inputs[key] == null || inputs[key].Length == 0) {
            return;
         }

         var deps = inputs[key];
         foreach (var dep in deps) {
            // we've already added this branch of the dependency tree so go to the next dependency
            if (totalDependencies.Contains(dep)) {
               continue;
            }

            // the recursion (see how this method calls itself?)
            GetDependencies(dep, inputs, ref totalDependencies);
            totalDependencies.Add(dep);
         }
      }

      public static string BuildDependencies(Dictionary<char, char[]> inputs)
      {
         var sb = new StringBuilder();
         foreach (var input in inputs) {
            var td = new List<char>();
            GetDependencies(input.Key, inputs, ref td);
            sb.AppendLine($"{Guid.NewGuid()}, << Dependencies for {input.Key} >> {string.Join(",", td)},\"False\"");
         }

         return sb.ToString();
      }

      #endregion

      private static void Main(string[] args)
      {
         var data = JArray.Parse(json);
         var values = data.SelectTokens("..Input").Select(x => x.ToString()).ToArray();
         var inputs = MakeInputs(values);

         Console.WriteLine(BuildDependencies(inputs));
      }

      private static Dictionary<char, char[]> MakeInputs(IEnumerable<string> values)
      {
         var dict = new Dictionary<char, char[]>();
         foreach (var s in values) {
            var parts = s.Where(char.IsLetterOrDigit).ToArray();
            var deps = parts.Skip(1).Take(parts.Length).ToArray();
            var key = parts[0];

            dict[key] = deps;
         }

         return dict;
      }
   }
}
...