在C#中加入多个orderedDictionary

本文关键字:orderedDictionary | 更新日期: 2023-09-27 18:21:10

如何有效地合并多个orderedDictionary

在C#中,我已经在线检查过了,但我只能看到合并NamevaluePairs的实现。

我正在尝试加入以下已订购的词典:

OrderedDictionary ticketToPickerMapForVerifiedTab = new OrderedDictionary();
OrderedDictionary ticketToPickerMapForHVTab = new OrderedDictionary();
OrderedDictionary ticketToPickerMapForKPTab = new OrderedDictionary();

这些字典中的关键字是唯一的

我需要得到的集合仍然是一个OrderedDictionary对象。

请注意,我的问题与这里提出的问题不同:在C#中合并字典

正如该例子所示,Keyvaluepair<TKey,TValue>,而我的是指使用OrderedDictionary,因为在我的代码中其他地方使用了Ordered Dictionary的特殊功能。

在C#中加入多个orderedDictionary

您可以使用LINQ来合并它们。请参阅以下代码:

var dictionariesMerged = ticketToPickerMapForVerifiedTab.Cast<DictionaryEntry>()
    .Union(ticketToPickerMapForHVTab.Cast<DictionaryEntry>())
    .Union(ticketToPickerMapForKPTab.Cast<DictionaryEntry>());
var dictionary = new OrderedDictionary();
foreach (DictionaryEntry tuple in dictionariesMerged)
    dictionary.Add(tuple.Key, tuple.Value);

类似下面的"MergeDictionaries"方法将合并给定词典的内容。这不能处理多个字典中存在一个关键字的情况。

[TestFixture]
public class Class1
{
    private OrderedDictionary MergeDictionaries(params OrderedDictionary[] dictionaries)
    {
        var merged = new OrderedDictionary();
        foreach (var dictionary in dictionaries)
        {
            foreach (DictionaryEntry entry in dictionary)
            {
                merged.Add(entry.Key, entry.Value);
            }
        }
        return merged;
    }
    [Test]
    public void Test()
    {
        var d1 = new OrderedDictionary
        {
            {"x", "v1"},
            {"b", "v2"},
        };
        var d2 = new OrderedDictionary
        {
            {"d", "v3" },
            {"c", "v4" }
        };
        var d3 = new OrderedDictionary
        {
            {"z", "v5" },
            {"y", "v6" }
        };
        var merged = MergeDictionaries(d1, d2, d3);
        var expected = new OrderedDictionary
        {
            {"b", "v2"},
            {"c", "v4" },
            {"d", "v3" },
            {"x", "v1"},
            {"y", "v6" },
            {"z", "v5" }
        };
        Assert.That(merged, Is.EquivalentTo(expected));
    }
}