Соединение строки без значений NULL с использованием лямбда-выражения - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь вернуть результат JSON в одном из моих методов ASP.NET MVC, как показано ниже:

Dictionary<string, List<System.ComponentModel.DataAnnotations.ValidationResult>> resp = 
    MyMethod(params);

return Json(new 
{ 
    result = res, 
    message = string.Join(";", resp.Select(v => v.Value.First().ErrorMessage))
}, JsonRequestBehavior.AllowGet);

resp словарь может быть пустым или нет. resp также может быть null. Когда оно не пустое и не null, пара ключ-значение может содержать null для значения, например, key = "errors", но его соответствующее значение установлено на null. Поэтому, учитывая это, я хочу, чтобы поле message содержало разделенный точкой с запятой список, содержащий все значения словаря, отличные от null. Если соответственно пусто, null, или все значения словаря null, «сообщение» будет содержать пустую строку.

Примеры, возможные сценарии:

  1. Когда респпустая строка или сообщение NULL => будет пустой строкой
  2. Если соответственно не пусто / пусто, примеры:
    • {"errors", "blabla"}, {"warn",NULL} => сообщение будет "blabla"
    • {"errors", "blabla"}, {"errors", "blablabla"}, {"warn", NULL} => сообщение будет "blabla"; blablabla "
    • {" errors ", NULL}, {" warn ", NULL} => сообщение будет пустой строкой

Как я могусделать это, используя лямбда-выражение для получения этих результатов?

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Вы можете напрямую работать со свойством Values (которое является List<ValidationResult>) res, и вы можете просто выбрать все те, где ErrorMessage не равно нулю или не пусто:

return Json(new
{
    result = res,
    message = resp == null ? string.Empty : string.Join(";", 
        resp.Values.SelectMany(value => value
            .Where(validationResult => !string.IsNullOrEmpty(validationResult?.ErrorMessage))
            .Select(validationResult => validationResult.ErrorMessage)))
}, JsonRequestBehavior.AllowGet);
1 голос
/ 08 октября 2019

Как правило, нам не нужно беспокоиться о пустых списках или словарях, но нулевые значения требуют дополнительной проверки. У вас также есть коллекция коллекций, поэтому, чтобы сгладить, что вы можете использовать SelectMany.

Просто сосредоточьтесь на получении сообщения, вам не нужно делать все это в одной строке кода.

   var message = resp==null ? "" : string.Join(";", 
    resp.Where(l => l.Value != null)
        .SelectMany( l=> 
          l.Value.Where(vr => vr != null && !String.IsNullOrEmpty(vr.ErrorMessage))
           .Select( vr => vr.ErrorMessage )));

Это должно дать вам сообщение. Извините, я не скомпилировал и не запустил его, но он должен иметь все проверки на нулевое значение и выравнивание, которые вам нужны.

...