Фильтр с лямбда и изменение некоторых значений - PullRequest
0 голосов
/ 16 октября 2019

Я получаю List<KeyValuePair<Parameter, string>> (параметр - Enum). Теперь я всегда получаю 15 из этих ListItems, те, которые не нужны, являются нулевыми или пустыми. С этими значениями (строковая часть пары) я должен заполнить различные запросы API. Относительно конечных точек API некоторые значения имеют разные имена, но имеют одно и то же значение. Поэтому мне пришлось бы изменить некоторые значения. Я делал это до сих пор:

public void CreateRequest(ApiEndpoints endpointType, string endpointName, List<KeyValuePair<Parameters, string>> parameters)
{
  List<KeyValuePair<string, string>> parameterList = new List<KeyValuePair<string, string>>();
  switch(endpointType)
  {
    case ApiEndpoints.Model:
      string modelId = parameters.Where(k => k.Key == Parameters.Model).Select(k => k.Value).FirstOrDefault();
      if(!string.IsNullOrWhiteSpace(modelId))
        {
          parameterList.Add(new KeyValuePair<string, string>("id", modelId));
        }
        break;
    case ApiEndpoints.Group:
      string groupId = parameters.Where(k => k.Key == Parameters.Group).Select(k => k.Value).FirstOrDefault();
      modelId = parameters.Where(k => k.Key == Parameters.Model).Select(k => k.Value).FirstOrDefault();
      if (!string.IsNullOrWhiteSpace(groupId))
      {
        parameterList.Add(new KeyValuePair<string, string>("id", groupId));
      }
      if (!string.IsNullOrWhiteSpace(modelId))
      {
        parameterList.Add(new KeyValuePair<string, string>("modelId", modelId));
      }
      break;
...
  }
}

private string QueryBuilder(List<KeyValuePair<string, string>> parameters)
{
    string query = string.Empty;
    bool firstItem = true;
    foreach(var parameter in parameters)
    {
        if (firstItem)
        {
            query += "?";
            firstItem = false;
        }
        else
        {
            query += "&";
        }
        query += parameter.Key + "=" + parameter.Value;
    }
    return query;
}

Это отчасти необходимо, потому что ID модели иногда используется как «id», а иногда как «ModelId», в зависимости от конечной точки.

КакВы можете видеть, что обработка параметров становится все более объемной. Некоторые конечные точки имеют до 8 необязательных параметров. И мы (до сих пор) на 21 конечной точке. Но есть и другие. Так что будет действительно неясно пропустить этот код. У кого-нибудь есть идея, как сократить / выровнять этот код? (15 KeyValuePairs исправлены. Я не могу это изменить. Только моя обработка.
Возможно ли изменить строку внутри .Select в лямбда-выражении? Таким образом, каждый параметр будет уменьшен до одной строки.

1 Ответ

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

Я не уверен, что полностью понимаю проблему, но если читаемость кода CreateRequest , вы всегда можете создать вспомогательную функцию, например, AddParamIfFound и выполнить:

case ApiEndpoints.Model:
    AddParamIfFound(parameterList, parameters, "id", Parameters.Model);
    break;

case ApiEndpoints.Group:
    AddParamIfFound(parameterList, parameters, "id", Parameters.Group);
    AddParamIfFound(parameterList, parameters, "modelId", Parameters.Model);
    break;

AddParamIfFound должно быть тривиально реализовать путем рефакторинга существующего кода.

...