вернуть разницу из словаря - PullRequest
0 голосов
/ 23 декабря 2019

Я пытаюсь сравнить значения моего словаря и отобразить мои результаты следующим образом.

Несоответствие значений поля для поля: Ожидаемое: 001 Фактическое: 002

Несоответствие значений поля для поля: Ожидаемое: 003 Фактическое: 002

Я могу получить разницу для каждой строки в моем словаре, но я не уверен, как отобразить мой результат в списке строк.

Вот что я попробую

public static string ValidateMvpFields(string value1, Dictionary<string, ValueMap> value2)
        {
            var xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(value1);

            foreach (var item in value2.Keys)
            {
                try
                {
                    var Val1 = xmlDoc.SelectSingleNode(responseParameters[item].XPath).InnerText;
                    var Val2 = responseParameters[item].Value;
                    if (!Val1.Trim().Equals(Val2.Trim()))
                    {
                        var results = ErrorMessage = $"Mvp Field Values Mismatch For Field: {item} Expected:{Val1} Actual:{Val2}";
                        string result = null;
                        result += String.Join(Environment.NewLine, results);
                    }
                    continue;

                }
                catch (Exception ex)
                {
                    var results = ErrorMessage = $"Invalid Xpath: {value2[item].XPath} For Field:{item} Error:{ex.Message}";
                    /*return results*/
                    ;

                }
            }

            return "";


        }

Вот пример моего словаря

public static Dictionary<string, ValueMap> Example = new Dictionary<string, ValueMap>
                  {
                    {"Example1", new ValueMap { XPath = "", Value = "5123"} },
                    {"Example2", new ValueMap { XPath ="", Value = "123"} },
}

1 Ответ

1 голос
/ 23 декабря 2019

Вместо инициализации string result = null внутри цикла, инициализируйте StringBuilder вне цикла for и добавляйте к нему каждый результат.

Инициализация string result = null каждый раз создает новую строковую переменную каждый раз иВы не можете получить ранее сохраненный результат при выполнении итерации внутри цикла for.

public static string ValidateMvpFields(string value1, Dictionary<string, ValueMap> value2)
    {
        var xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(value1);
        StringBuilder sb = new StringBuilder();  //Initialize StringBuider

        foreach (var item in value2.Keys)
        {
            try
            {
                var Val1 = xmlDoc.SelectSingleNode(responseParameters[item].XPath).InnerText;
                var Val2 = responseParameters[item].Value;
                if (!Val1.Trim().Equals(Val2.Trim()))
                {
                    var results = ErrorMessage = $"Mvp Field Values Mismatch For Field: {item} Expected:{Val1} Actual:{Val2}";
                    //Append new value every time into string builder
                    sb.Append(Environment.NewLine);
                    sb.Append(results);
                }
                continue;

            }
            catch (Exception ex)
            {
                var results = ErrorMessage = $"Invalid Xpath: {value2[item].XPath} For Field:{item} Error:{ex.Message}";
                /*return results*/
                ;

            }
        }

        return "";
    }

string Тип является неизменным, когда вы присваиваете новое значение строке, он создает новый объект, StringBuilder является неизменным, поэтомупомогает избежать утечки памяти.

Если вы хотите сохранить результат в списке, используйте List<string> и каждый раз добавляйте новый результат, например

   List<string> results = new List<string>(); //Initialize list
   ……
   results.Add(result);  //Add new value to it
...