C#等效的C ++地图(C# equivalent of C++ map)

2019-08-22 12:46发布

我想保留一些总数为不同的帐户。 在C ++中我会使用STL是这样的:

map<string,double> accounts;

// Add some amounts to some accounts.
accounts["Fred"] += 4.56;
accounts["George"] += 1.00;
accounts["Fred"] += 1.00;

cout << "Fred owes me $" << accounts['Fred'] << endl;

现在,我会怎么做在C#同样的事情?

Answer 1:

大致:-

var accounts = new Dictionary<string, double>();

// Initialise to zero...

accounts["Fred"] = 0;
accounts["George"] = 0;
accounts["Fred"] = 0;

// Add cash.
accounts["Fred"] += 4.56;
accounts["George"] += 1.00;
accounts["Fred"] += 1.00;

Console.WriteLine("Fred owes me ${0}", accounts["Fred"]);


Answer 2:

Dictionary<string, double> accounts;


Answer 3:

虽然System.Collections.Generic.Dictionary匹配的标签“HashMap的”,并会在你的例子很好地工作,这不是C ++的标准::地图完全等效 - 的std ::地图是一个有序集合。

如果顺序很重要,你应该使用SortedDictionary 。



Answer 4:

你想要的字典类。



Answer 5:

字典是最常见的,但可以使用其他类型的集合,例如System.Collections.Generic.SynchronizedKeyedCollection,System.Collections.Hashtable,或任何KeyValuePair集合



Answer 6:

此代码是你所需要的:

   static void Main(string[] args) {
        String xml = @"
            <transactions>
                <transaction name=""Fred"" amount=""5,20"" />
                <transaction name=""John"" amount=""10,00"" />
                <transaction name=""Fred"" amount=""3,00"" />
            </transactions>";

        XDocument xmlDocument = XDocument.Parse(xml);

        var query = from x in xmlDocument.Descendants("transaction")
                    group x by x.Attribute("name").Value into g
                    select new { Name = g.Key, Amount = g.Sum(t => Decimal.Parse(t.Attribute("amount").Value)) };

        foreach (var item in query) {
            Console.WriteLine("Name: {0}; Amount: {1:C};", item.Name, item.Amount);
        }
    }

而内容是:

名称:弗雷德; 金额:R $ 8,20;
姓名:John; 金额:R $ 10,00;

这是在C#这样的方式 - 在一个声明的方式!

我希望这有帮助,

里卡多·拉塞尔达布朗库堡



Answer 7:

当我们谈论STL,地图和字典,我建议采取看看C5库。 它提供了多种类型的字典和地图,我经常发现有用的(与其他许多有趣和有用的数据结构一起)的。

如果你是一个C ++程序员转移到像我一样C#中,你会发现这个库的重要资源(与本字典的数据结构)。

- 保罗



Answer 8:

C ++的最接近的等效std::map<>树内部)是C# OrderedDictionary<>树内部),而C# OrderedDictionary<>丢失选自C一些非常重要的方法++ std::map<>即: std::map::findstd::map::lower_boundstd::map::upper_boundstd::map::equal_range ,并且std::map iterators ,这基本上是为以前的4种方法的骨干。

为什么这些4个方法是重要的? 因为它给我们找到一个给定键的“行踪”,除了只能够检查是否有键存在,或SortedDictionary是保证订购的能力。

什么是在一个关键的“下落” std::map ? 关键不一定集合中存在,我们想知道的关键可能是在,通常在两个迭代器分别指向两个相邻的现有密钥的集合中的位置,所以我们可以在范围内运行的关键瀑布成在O(logN)复杂性。 如果没有这样的4种方法(与迭代器),一个具有做一个O(N)通过收集每一个范围中查询对密钥时间迭代。



文章来源: C# equivalent of C++ map