【问题标题】:How to Sort NameValue Collection and Store it in a string如何对 NameValue 集合进行排序并将其存储在字符串中
【发布时间】:2015-01-28 23:29:28
【问题描述】:

在这里,我将两组查询字符串参数存储到两个不同的名称值集合中。查询字符串参数顺序可能会有所不同,所以我只想对顺序进行排序,然后我需要将名称值集合存储到一个字符串中。

更新代码:

string url1 = @"http://www.somewebsitesampletest.com/dcs7o?data=142248494&dcp=smre&nparam=4567P&email=xxx.com";

string url2 = @"http://www.somewebsitesampletest.com/dcs7o?dcp=smre&data=142248494&email=xxx.com&nparam=4567P";

var NameValueCollection1 = HttpUtility.ParseQueryString(url1);
var NameValueCollection2 = HttpUtility.ParseQueryString(url2);

预期结果: 排序并转换为字符串后,结果应如下所示

string query1 = "data=142248494&dcp=smre&email=xxx.com&nparam=4567P";
string query2 = "data=142248494&dcp=smre&email=xxx.com&nparam=4567P";

【问题讨论】:

  • 如果您向我们展示您实际尝试过的内容会更好。
  • 我认为 ?& 是错误的网址格式。你也想要排序,但在你预期的结果中,你在电子邮件之前显示 nparam,这是什么排序?
  • 你为什么要把它放到 NVC 中呢?似乎您想要做的就是捕获 URI 的查询部分,对吧?所以只需在“?”之后对所有内容进行子串,这样更快更优雅。将所有内容解析到 NVC 中,然后再次将其重组为字符串,这在很多方面都是违反直觉的。
  • 我使用 NVC 进行比较。这就是我比较的方式, public bool CompareNameValueCollections(NameValueCollection exp, NameValueCollection rec) { return exp.AllKeys.OrderBy(key => key) .SequenceEqual(rec.AllKeys.OrderBy(key => key)) && exp.AllKeys。全部(key => exp[key] == rec[key]); } 比较后,我向用户显示我比较的所有参数是什么。

标签: c# asp.net .net linq c#-4.0


【解决方案1】:

这是一个使用 Linq 的解决方案。

基本上它使用Cast<T> 将键的NameValueCollection 更改为IEnumerable,然后其余的就很容易解释了。

public string GetSortedQueryString(string url)
{
    var queryString = HttpUtility.ParseQueryString(url);

    // Ignore null keys (caused by your ?& at the start of the query string
    var orderedKeys = queryString.Cast<string>().Where(k => k != null).OrderBy(k => k);

    return string.Join("&", orderedKeys.Select(k => string.Format("{0}={1}", k, queryString[k])));
}

您的网址的结果是:

data=142248494&dcp=smre&email=xxx.com&nparam=4567P
data=142248494&dcp=smre&email=xxx.com&nparam=4567P

电子邮件位于 nparam 之前,这与您预期的解决方案不同(我假设这是一个错误)。

【讨论】:

    【解决方案2】:

    LINQDictionarylistKeyValuePair 一起使用:

    string url1 = @"http://www.somewebsitesampletest.com/dcs7o?&data=142248494&dcp=smre&nparam=4567P&email=xxx.com";
    string query1 ="";
    Dictionary<String, String> paramDict = new Dictionary<string, string>();
    
    var query = from match in urlString.Split('?').Where(m => m.Contains('='))
                    .SelectMany(pr => pr.Split('&'))
                where match.Contains('=')
                select new KeyValuePair<string, String>(
                    match.Split('=')[0],
                    match.Split('=')[1]);
    
    query.ToList().ForEach(kvp => paramDict.Add(kvp.Key, kvp.Value));
    
    var List<KeyValuePair<string, string>> paramList = paramDict.ToList();
    
    paramList.Sort();
    
    foreach (KeyValuePair<string, int> pair in list)
    {
        query1+=pair.Key+"="+pair.Value+"&";
    }
    query1=query1.TrimEnd('&');
    

    【讨论】:

      【解决方案3】:

      我制作这个小提琴是因为我需要对查询字符串值进行排序以便正确比较 URI:(H/T 到 Jacob 的回答)

      https://dotnetfiddle.net/eEhkNk

      这会保留重复的键:

      public static string[] QueryStringOmissions = new string[] { "b" };
      
      public static NameValueCollection SortAndRemove(NameValueCollection collection)
      {
          var orderedKeys = collection.Cast<string>().Where(k => k != null).OrderBy(k => k);
          var newCollection = HttpUtility.ParseQueryString(String.Empty);
          foreach(var key in orderedKeys)
          {
              if (!QueryStringOmissions.Contains(key))
              {
                  foreach(var val in collection.GetValues(key).Select(x => x).OrderBy(x => x).ToArray())
                  {
                      newCollection.Add(key, val);
                  }
              }
          }
          return newCollection;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多