【问题标题】:Avoid duplicate code in SortedDictionary C#避免 SortedDictionary C# 中的重复代码
【发布时间】:2016-06-19 12:37:52
【问题描述】:

所以我有两个 if 语句来处理字典值。如果方法是 POST,我只需将 status 参数添加到字典中。所有其他参数都相同。

var stringBuilder = new StringBuilder();                    
var dictionary = new SortedDictionary<string, string>();
if (method == "GET")
{
    stringBuilder.Append("GET&");
    stringBuilder.Append(Uri.EscapeDataString(url));
    stringBuilder.Append("&");
    dictionary = new SortedDictionary<string, string>
    {
        { "oauth_version" , oauthVersion },
        { "oauth_consumer_key", consumerKey },
        { "oauth_nonce" , oauthNonce },
        { "oauth_signature_method" , oauthSignatureMethod },
        { "oauth_timestamp" , oauthTimeStamp },
        { "oauth_token" , accessToken },
    };
}

if (method == "POST")
{
    stringBuilder.AppendFormat("POST&{0}&", Uri.EscapeDataString(url));
    dictionary = new SortedDictionary<string, string>
    {
        { "oauth_version" , oauthVersion },
        { "oauth_consumer_key", consumerKey },
        { "oauth_nonce" , oauthNonce },
        { "oauth_signature_method" , oauthSignatureMethod },
        { "oauth_timestamp" , oauthTimeStamp },
        { "oauth_token" , accessToken },
        { "status" , status }
    };
}

无论如何要避免在我的代码中重复。任何建议都会很方便。

请注意。

【问题讨论】:

  • “重复”是什么意思?就字典的键而言,不能有任何重复项。我觉得你的问题很难理解,你不想复制什么?
  • @VisualVincent 我的意思是如果方法是 POST 我只需要添加状态参数。get 和方法中的所有参数都是相同的。

标签: c# asp.net asp.net-mvc code-duplication


【解决方案1】:

我看不出你的 StringBuilder 实例变量和你正在构建的字典之间有什么关系,所以假设字典代码的重复,它可以从那些 if 条件中取出,然后你可以像这样处理剩余的StringBuilder 实例:

var stringBuilder = new StringBuilder();
stringBuilder.AppendFormat("{0}&{1}&", method, Uri.EscapeDataString(url));

var dictionary = new SortedDictionary<string, string>
{
    { "oauth_version", oauthVersion },
    { "oauth_consumer_key", consumerKey },
    { "oauth_nonce", oauthNonce },
    { "oauth_signature_method", oauthSignatureMethod },
    { "oauth_timestamp", oauthTimeStamp },
    { "oauth_token", accessToken },
};

if (method == "POST")
{
    // Only add the status parameter if the method is POST
    dictionary["status"] = status;
}

因此,基本上在此代码执行stringBuilderdictionary 实例变量后,如您的问题所示,将具有预期值。

话虽如此,您的字典看起来好像包含查询字符串参数值。如果是这种情况,那么在考虑通过 HTTP 协议发送它们之前,您肯定会希望对这些值进行正确的 url 编码:

var dictionary = new SortedDictionary<string, string>
{
    { "oauth_version", Uri.EscapeDataString(oauthVersion) },
    { "oauth_consumer_key", Uri.EscapeDataString(consumerKey) },
    { "oauth_nonce", Uri.EscapeDataString(oauthNonce) },
    { "oauth_signature_method", Uri.EscapeDataString(oauthSignatureMethod) },
    { "oauth_timestamp", Uri.EscapeDataString(oauthTimeStamp) },
    { "oauth_token", Uri.EscapeDataString(accessToken) },
};

if (method == "POST")
{
    // Only add the status parameter if the method is POST
    dictionary["status"] = Uri.EscapeDataString(status);
}

【讨论】:

  • 嗨 Darin。我的意思是 post 方法只是将这个 { "status" , status } 添加到字典中。Get 方法没有 { "status" , status }
  • 好的,我已经用一个如何实现这一点的例子更新了我的答案。如果方法的值为 POST,则只需将“status”参数添加到字典即可。
  • 嗨达林,谢谢你的帮助。为什么我没想到这个
最近更新 更多