2015-01-16 1 views
0

이것은 내가 지금 꽤 오랫동안보고 있었던 것입니다. 그리고 내가 잘못한 곳을 볼 수는 없습니다. 너희들 도울 수 있기를 바라 네^Sorted-ception - SortedDictionary 내부의 SortedList에 추가

그래서 내 문제는 내가 정렬하려고하는 311 개체가있다. SortedDictionary<int, SortedList<int, Entry>>(>). 그러나 그 결과는 112 개의 객체 만있는 사전입니다. 나머지는 어디로 가고 왜 그들은 어디로 가야하지 않는가?

public SortedDictionary<int, SortedList<int, Entry>> GetSortedByForum(int id) 
    { 
     SortedDictionary<int, SortedList<int, Entry>> result = new SortedDictionary<int, SortedList<int, Entry>>(); 

     foreach (var e in GetByForum(id)) 
     { 
      e.fk_entry = e.fk_entry == null 
       ? 0 
       : e.fk_entry; 

      if (!result.ContainsKey((int)e.fk_entry)) 
       result[(int)e.fk_entry] = new SortedList<int, Entry>(); 

      if (!result[(int)e.fk_entry].ContainsKey(e.fk_language)) 
       result[(int)e.fk_entry][e.fk_language] = new Entry(); 

      result[(int)e.fk_entry][e.fk_language] = e; 
     } 

     return result; 
    } 

배경 정보는 도움이 될 수 있습니다 :

  • fk_entry는 객체의 부모입니다. entry에는 부모 만있을 수 있지만 여러 명의 자녀가있을 수 있습니다.
  • fk_language는 항목의 언어가하는 항목이 여러 번역
  • 항목 어떤 종류의 기사입니다을 가질 수있다. 사전은 학부모 님, 그리고 언어로 주문해야합니다.
+1

GetForum은 311 etries를 반환하지만 결과에는 112 만 있습니다. 그렇다면 GetForum은 많은 중복을 반환합니다. – pm100

+0

@ pm100 : 그게 내가 말한 것입니다. 그러나 중복이 없습니다. 이미 확인했습니다 ^^ –

+2

- 사라진 항목 중 하나를 찾아서 어떤 일이 일어나는지 확인하십시오 - 루프에 조건부 중단 점을 넣으십시오 – pm100

답변

1

문제는 다음 코드 라인에 있습니다. 특정 언어에 대한 첫 번째 항목 만 추가합니다. 나중에 동일한 부모 및 언어에 대한 항목이 추가되지 않습니다. 가능한 한 같은 코드의 많은 유지

if (!result[(int)e.fk_entry].ContainsKey(e.fk_language)) 
    result[(int)e.fk_entry][e.fk_language] = new Entry(); 

, 당신이 각각의 특정 언어와 관련된 항목의 수집을 원한다고 생각 :

var result = new SortedDictionary<int, SortedList<int, List<Entry>>>(); 

... 
... 

if (!result[(int)e.fk_entry].ContainsKey(e.fk_language)) 
    result[(int)e.fk_entry][e.fk_language] = new List<Entry>(); 

result[(int)e.fk_entry][e.fk_language].Add(e); 

당신의 코멘트를 감안할 때

, "어떻게 것 fk_language를 사용하여 다른 번역본을 정렬하고 싶다면 어떻게해야합니까? "

var result2 = new SortedDictionary<int, Dictionary<int, List<int>>>(); 

if (!result2[(int)e.fk_entry].ContainsKey(e.some_unique_entry_id)) 
    result2[(int)e.fk_entry][e.some_unique_entry_id] = new List<int>(); 

result2[(int)e.fk_entry][e.some_unique_entry_id].Add(e.fk_language); 

을 또는 당신이 필요로하는 형식으로 조작 할 첫 번째 SortedDictionary를 쿼리하는 LINQ를 사용, 당신은 당신의 루프에이 같은 통합 시도 할 수 있습니다.

+0

그게 전부입니다! 보너스 질문 : 'fk_language'로 다른 번역을 정렬하고 싶다면 어떻게해야합니까? –

+1

나는이 코드로 두 가지 방법으로 할 수 있다고 생각하지 않는다. 어쩌면 당신은 별도의'var result = new SortedDictionary >>()'을 정의 할 수 있고, 루프의 반복마다 Entry의 존재를 찾는다. 현재 항목의 언어를'List '에 추가하십시오. 그것은 작동하지 않을 수도 있습니다 ... 그것은 단지 내 머리 꼭대기에 있습니다. 또는 원하는 형식으로 조작하려면'SortedDictionary >> '을 통해 LINQ 쿼리를 실행하십시오. 그게 확실하지 않다면 그 일로 무엇을하고 있는지에 대한 자세한 내용을 추가해야 할 것입니다. –

관련 문제