2011-12-28 3 views
3

나는이 목록이 있습니다사전 int 값을 기준으로 사전 목록을 <int, string>으로 주문하려면 어떻게해야합니까?

List<Dictionary<int, string>> list = new List<Dictionary<int, string>>(); 

을 나는 사전 int 값에 따라 그것 (오름차순)를 주문하고 싶습니다. 내가 어떻게 해?

예 :

Dictionary<int, string> Min1 = new Dictionary<int, string>(); 
Dictionary<int, string> Min2 = new Dictionary<int, string>(); 
Dictionary<int, string> Min3 = new Dictionary<int, string>(); 
Dictionary<int, string> Min4 = new Dictionary<int, string>(); 
Dictionary<int, string> Min5 = new Dictionary<int, string>(); 

Min1.Add(3, "name"); 
Min2.Add(1, "hello"); 
Min3.Add(5, "marco"); 
Min4.Add(4, "is"); 
Min5.Add(2, "my"); 

List<Dictionary<int, string>> list = new List<Dictionary<int, string>>(); 
list.Add(Min1); 
list.Add(Min2); 
list.Add(Min3); 
list.Add(Min4); 
list.Add(Min5); 

// NOW I NEED TO ORDER list BASED ON DICTIONARY INT VALUE 
// SO THE ORDER ON THE LIST SHOULD BE Min2, Min5, Min1, Min4, Min3 

나는 목록을 정렬하고 싶습니다, 그래서 내가 문자열에 도착하면 내가주기를 내가

+2

당신이 원하는 정렬의 예를 들어 주실 수 있습니까? – Elastep

+0

예제를 추가했습니다 – markzzz

+1

이것은별로 의미가 없습니다. 각 사전의 가장 작은 키로 주문 하시겠습니까? 서로 다른 사전을 비교하기 위해서는 하나의 가치가 있어야하며 어느 사전을 선택해야 하는지를 알아야합니다. –

답변

6

당신이 원하는 경우에 "안녕 내 이름은 마르코입니다"인쇄 당신이 할 수있는

list.SelectMany(x=>x).OrderBy(x=>x.Key) 

을하지만 당신은 마음에 들지 않는 경우 데이터를 평평하게 그냥 사전 분류 : 데이터를 평평으로 정렬이 시도 할 수

,
list.Select(x=>x.OrderBy(y=>y.Key)); 

편집 : 나는 당신이 할 수 있도록 당신은 단지 하나 개의 사전을 사용할 필요가 알고있는 것처럼 : 당신을 대신 사전의 목록을 사용하려면

는 (귀하의 경우 보인다 좋지 않다)
Dictionary<int,string> dic = new Dictionary<int,string>(); 
var result = dic.OrderBy(x=>x.Key).ToLookup(x=>x); 

을 이것을 할 수있다.

List<KeyValuePair<int,string>> lst1 = new List<KeyValuePair<int,string>>(); 
var result = lst1.OrderBy(x=>x.Key).ToLookup(x=>x); 
1

제네릭을 정의 할 때 SortedDictionary 또는 SortedList를 사용할 수 있습니다. 이렇게하면 어떤 순서로 요소를 사전에 추가하든 요소는 키 요소 (어떤 것이 int 유형인지)를 기반으로 정렬 된 형식으로 저장됩니다. 또한 SortedDictionary는 BinarySearch 트리를 사용하므로 시간이 효율적으로 사용됩니다. 단일 사전을 일단 사용하여 LINQ 다음과 같이

+0

한 가지 더, 나는 왜 당신이 5 개의 사전을 사용하는지 궁금하며, 하나의 사전 (min1)은 모든 KeyValue 쌍을 저장할 수 있습니다. –

1

는, 당신은 사전에 키에 따라 정렬 된 값 목록을 만들 수 있습니다 :

: 당신이 SortedList을 사용할 수 있습니다 LINQ없이

var dict = new List<Dictionary<int, string>>(); 
var list = dict.OrderBy(e => e.Key).ToList(); 

이에서

SortedList<int, string> sortList = new SortedList<int, string>(dict); 

, 당신은 다음 일반 List<T>을 원하는 경우 :

List<string> list = new List<string>(sortList.Values); 
1

그러나 Marco, 나는 위의 시나리오를 과제로 삼아 원하는 결과의 코드 구현을 만들었습니다. 아래 코드를 게시하고 있습니다. 너트 껍질에서는 정렬 된 사전 요소를 저장하는 다른 목록을 만들어야합니다. 디버거에서 다음 코드를 실행하고 결과를 직접 볼 수 있습니다.

public class program 
{ 

    public static void Main() 
    { 

    SortedDictionary<int, string> Min1 = new SortedDictionary<int, string>(); 
    SortedDictionary<int, string> Min2 = new SortedDictionary<int, string>(); 
    SortedDictionary<int, string> Min3 = new SortedDictionary<int, string>(); 
    SortedDictionary<int, string> Min4 = new SortedDictionary<int, string>(); 
    SortedDictionary<int, string> Min5 = new SortedDictionary<int, string>(); 
     Min1.Add(3, "name"); 
     Min2.Add(1, "hello"); 
     Min3.Add(5, "marco"); 
     Min4.Add(4, "is"); 
     Min5.Add(2, "my"); 

List<SortedDictionary<int, string>> list = new List<SortedDictionary<int, string>>(); 
     list.Add(Min1); 
     list.Add(Min2); 
     list.Add(Min3); 
     list.Add(Min4); 
     list.Add(Min5); 

     List<SortedDictionary<int, string>> final_list = new List<SortedDictionary<int, string>>(); 
     List<int> index = new List<int>() ; 

     foreach (var element in list) 
     { 
      foreach (var elements in element) 
      { 
       index.Add(elements.Key); 
       Console.Write(" " +elements.Value+ " "); 
      } 
     } 
     index.Sort(); 


     foreach (var indexelement in index) 
     { 
      foreach (var element in list) 
      { 
       foreach (var elements in element) 
       { 
        if (indexelement == elements.Key) 
        { 
         final_list.Add(element); 
        } 

       } 

      } 
     } 
     Console.WriteLine(); 
     foreach (var element in final_list) 
     { 
      foreach (var elements in element) 
      { 
       Console.Write(" " + elements.Value+ " "); 
      } 
     } 

     Console.ReadLine(); 
    } 
} 

해피 코딩 :)

관련 문제