使用Lambda过滤并更改某些值

问题描述 投票:0回答:1

我得到一个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个端点。但是还有更多。因此,忽略此代码将变得非常不清楚。有谁知道如何缩短/展平此代码? (这15个KeyValuePair是固定的。我无法更改它。仅是我的处理。是否有可能在lambda表达式中的.Select内更改字符串?这样,每个参数将减少为一行。

c# list lambda keyvaluepair
1个回答
0
投票

我不确定我是否完全理解问题,但是如果这是CreateRequest

© www.soinside.com 2019 - 2024. All rights reserved.