3

私は1つの辞書を持っています

Dictionary<string, string> rList = new Dictionary<string, string>();
rList .Add("/a/b/c", "35");
rList .Add("/a/c/f/v", "25");
rList .Add("/a/r/d/c/r/v", "29");
rList .Add("/a", "21");
rList .Add("/a/f, "84");

キーに存在する「/」の数に基づいて、この辞書を並べ替えたいだけです。私の予想アウトプットは、

("/a/r/d/c/r/v", "29")
("/a/c/f/v", "25")
("/a/b/c", "35")
("/a/f, "84")
("/a", "21")
4

4 に答える 4

12

Dictionary<TKey, TValue>型は、.Net の順序付けられていないコレクションです。順序付けが必要な場合は、代わりに使用して、文字列内の値をカウントSortedDictionary<TKey, TValue>するカスタムを提供する必要があります。IComparer<string>/

sealed class SlashComparer : IComparer<string> { 
  static int CountSlashes(string str) { 
    if (String.IsNullOrEmpty(str)) { 
      return 0;
    }

    int count = 0;
    for (int i = 0; i < str.Length; i++) {
      if (str[i] == '/') {
         count++;
      }
    }
    return count;
  }

  public int Compare(string left, string right) { 
    int leftCount = CountSlashes(left);
    int rightCount = CountSlashes(right);
    return rightCount - leftCount;
  }
}

で使用するにSortedDictionaryは、変更する必要があるのは宣言だけです

var comparer = new SlashComparer();
var rList = new SortedDictionary<string, string>(comparer);

コードの残りの部分は同じままでかまいません

于 2013-03-27T19:26:48.607 に答える
3

JaredParが既に回答したようDictionary<TKey, TValue>に、コンテンツには順序が指定されていません。List<KeyValuePair<TKey, TValue>>ただし、希望する順序で取得できます。

List<KeyValuePair<string, string>> results = rList.OrderByDescending(x => x.Key.Count(c => c == '/')).ToList();
于 2013-03-27T19:29:45.203 に答える
1

これを試して:

 var result = rList.OrderBy(input => input.Key.Select(c => c == '/').Count()).Reverse().ToList();
于 2013-03-27T19:29:55.067 に答える
0

リンクパッドから:

void Main()
{
    Dictionary<string, string> rList = new Dictionary<string, string>();
    rList .Add("/a/b/c", "35");
    rList .Add("/a/c/f/v", "25");
    rList .Add("/a/r/d/c/r/v", "29");
    rList .Add("/a", "21");
    rList .Add("/a/f", "84");

    var x = from a in rList
        let i = a.Key.ToCharArray().Count (k => k.Equals('/') )
        orderby i descending
        select a;

    x.Dump();
}
于 2013-03-27T19:31:13.133 に答える