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;
}
背景信息可能有帮助:
- fk_entry 是对象父对象。
entry
只能有一个父项,但可以有多个子项。
- fk_language是词条的语言,一个词条可以有多个翻译
- entry 是某种类型的文章。字典应按父级排序,然后按语言排序。
您的问题出在以下代码行中。它只添加特定语言的第一个条目 - 不会添加相同母语和语言的后续条目。
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,将其操作成你需要的格式。
所以我已经研究了很长时间了。而且我看不出我哪里做错了。希望大家帮忙^^
所以我的问题是我有 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是词条的语言,一个词条可以有多个翻译
- entry 是某种类型的文章。字典应按父级排序,然后按语言排序。
您的问题出在以下代码行中。它只添加特定语言的第一个条目 - 不会添加相同母语和语言的后续条目。
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,将其操作成你需要的格式。