使用 Lambda 过滤并更改一些值

Filter with Lambda and changing some values

我得到一个 List<KeyValuePair<Parameter, string>>(参数是一个枚举)。现在我总是得到 15 个这样的 ListItem,那些不需要的是 null 或空的。使用这些值(对的字符串部分)我必须填写不同的 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;
}

这部分是必要的,因为 modelId 有时用作 "id",有时用作 "modelId",具体取决于端点。

如您所见,参数处理变得越来越庞大。一些端点最多有 8 个可选参数。我们(到目前为止)有 21 个端点。但是还会有更多。所以忽略这段代码会变得非常不清楚。有人知道如何 shorten/flatten 这段代码吗? (这 15 个 KeyValuePairs 是固定的。我不能改变它。只有我的处理。
是否可以更改 lambda 表达式中 .Select 内的字符串?这样每个参数都会减少到一行。

我不确定我是否完全理解了这个问题,但是如果是 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 应该可以通过重构现有代码轻松实现。