別のアカウントの合計を保持したい。 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#で同じことをどのように行うのでしょうか?
大体:-
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"]);
Dictionary<string, double> accounts;
System.Collections.Generic.Dictionaryはタグ「hashmap」と一致し、例ではうまく機能しますが、C++のstd :: mapと完全に同等ではありません-std :: mapは順序付けられたコレクションです。
順序が重要な場合は、 SortedDictionary を使用する必要があります。
Dictionary クラスが必要です。
辞書が最も一般的ですが、他のタイプのコレクションを使用できます。 System.Collections.Generic.SynchronizedKeyedCollection、System.Collections.Hashtable、または任意のKeyValuePairコレクション
このコードはあなたが必要とするすべてです:
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;
名前:ジョン;金額:R $ 10,00;
それがC#でこれを行う方法です-宣言的な方法で!
これがお役に立てば幸いです、
リカルド・ラセルダ・カステロ・ブランコ
STL、マップ、および辞書について話している間、 C5 ライブラリをご覧になることをお勧めします。それは私が頻繁に有用であることがわかったいくつかのタイプの辞書とマップを提供します(他の多くの興味深く有用なデータ構造とともに)。
あなたが私と同じようにC#に移行するC++プログラマーであるなら、このライブラリーは素晴らしいリソース(およびこの辞書のデータ構造)であることがわかります。
-ポール
C++ _std::map<>
_(内部ツリー)に最も近いものはC#_OrderedDictionary<>
_(内部ツリー)ですが、C#_OrderedDictionary<>
_にはC++ _std::map<>
_のいくつかの非常に重要なメソッドがありません。 :_std::map::find
_、_std::map::lower_bound
_、_std::map::upper_bound
_、_std::map::equal_range
_、および_std::map
_ iterators
は、基本的に前の4つのメソッドのバックボーンです。
なぜこれらの4つの方法が重要なのですか?キーが存在するかどうかを確認できるだけでなく、SortedDictionaryの順序が保証されていることに加えて、特定のキーの「行方」を見つけることができるためです。
_std::map
_のキーの「行方」とは何ですか?キーは必ずしもコレクション内に存在する必要はありません。通常、コレクション内の2つの隣接する既存のキーをそれぞれ指す2つのイテレータ間のキーの位置を知りたいので、rangeキーはO(logN)
の複雑さに陥ります。そのような4つのメソッド(イテレーターを使用)がない場合、キーに対して範囲が照会されるたびにコレクションをO(N)
反復する必要があります。