Sorted-ception - 在SortedDictionary中添加SortedList

时间:2015-01-16 17:13:20

标签: c# list dictionary

所以这是我已经看了很长一段时间了。我无法看到我做错了什么。希望你们能帮忙^^

所以我的问题是我有311个对象,我尝试将其排序为SortedDictionary<int, SortedList<int, Entry>> (&gt;)。但结果是只有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 个答案:

答案 0 :(得分: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);

或者使用LINQ查询第一个SortedDictionary,将其操作为您需要的格式。