Sorted-ception - 添加到 SortedDictionary 内的 SortedList

Sorted-ception - Adding to a SortedList inside a SortedDictionary

所以我已经研究了很长时间了。而且我看不出我哪里做错了。希望大家帮忙^^

所以我的问题是我有 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;
    }

背景信息可能有帮助:

您的问题出在以下代码行中。它只添加特定语言的第一个条目 - 不会添加相同母语和语言的后续条目。

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);

鉴于您的评论,"How would I do it if I wanted to also sort the different translations by 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,将其操作成你需要的格式。