2016-11-12 6 views
0

私はキーとして文字列の辞書を持っており、値として整数リストのリストを持っています。それは、C#の値の順序に基づいて順序付けることが可能ですか?例えば値を基に辞書<string、List <int>>をソート

: myDict:

{ 
    "hp",<10,14,23> 
    "dell", <6,8,9,10> 
    "asus", <6,9,18> 
    "mac", <7,98> 
} 

としてソート:ここ

{ 
     "dell", <6,8,9,10> 
     "asus", <6,9,18> 
     "mac", <7,98> 
     "hp",<10,14,23> 
} 

は、私が試したものです:

//this creates a dictionary with requirements stated above for testing 
Dictionary<string, List<int>> myDict = new Dictionary<string, List<int> 
      >(); 


     var numbers = "8,13,16,21,24,25,31,33,36,63,66,70,76,82,94".Split(',').Select(Int32.Parse).ToList(); 
     myDict .Add("asus", numbers); 

     numbers = "6,84,90,99".Split(',').Select(Int32.Parse).ToList(); 
     myDict .Add("dell", numbers); 

     numbers = "10,11,20,21,23,26,28,29,31,38,39,40,50,52,61,65,66,70,75,94".Split(',').Select(Int32.Parse).ToList(); 
     myDict.Add("hp", numbers); 

     numbers = "4,17,42,56,62,79,80".Split(',').Select(Int32.Parse).ToList(); 
     myDict .Add("mac",numbers);    

行うこととしている部分並べ替え:

var orderedDictionary = myDict.OrderByDescending(pairs => pairs.Value); 

上記は「少なくとも1つのオブジェクトがIComparableを実装する必要があります」というエラーを示しています。 は、私はまた、文字列にリストを変換し、次の操作を行って試してみました:

var sortedDict = from entry in myDict 
          orderby entry.Value 
           ascending 
          select entry; 

上記は、しかし、それは文字列として数字を扱います働きました。したがって、10,85は、の前に表示されます。8,6 "、" ASCII表現が数字よりも高いためですと推測しています。

ソートされた整数リストの辞書をC#でソートするにはどうすればよいですか?他のセルより各セルをチェックして手動ソートを行う唯一の方法はありますか?

答えて

1

あなたはList<int>ためIComparer<T>実装する必要があります。

public MyListComparer : IComparer<List<int>> 
{ 
    public int Compare(List<int> x, List<int> y) 
    { 
     var minLength = x.Count < y.Count ? x.Count : y.Count; 
     for (var i = 0 ;i < minLength; i++) 
     { 
      if (x[i] > y[i]) 
      { 
       return 1; 
      } 
      if (x[i] < y[i]) 
      { 
       return -1; 
      } 
     } 
     if (x.Count > y.Count) 
     { 
      return 1; 
     } 
     if (y.Count > x.Count) 
     { 
      return -1; 
     } 
     return 0; 
    } 
} 

をとLINQのOrderByのthis過負荷とそれを使用します。

var orderedDictionary = myDict.OrderBy(pairs => pairs.Value, new MyListComparer()); 
+0

マイナーチェンジで働きました。 .lengthの代わりに.countを使用しました。リストにはlengthメソッドがないためです。 – ibininja

+0

あなたは絶対に正しいです、私の答えを修正しました。 – YuvShap

関連する問題