2009-08-13 16 views
237

Javaの世界からC#に移行するとHashMapに相当するのでしょうか?もしあなたが何をお勧めしますか?C#Java HashMap相当の

答えて

343

Dictionaryがおそらく最も近いでしょう。 System.Collections.Generic.DictionarySystem.Collections.Generic.IDictionaryインターフェイス(JavaのMapインターフェイスに似ています)を実装しています。

あなたが知っておくべきいくつかの顕著な違い:

    • JavaのHashMapのが/取得アイテム
      • myMap.put(key, value)
      • を設定するための putgetメソッドを持っている/追加取得アイテム
      • MyObject value = myMap.get(key)
    • C#の辞書取得/設定項目のため[]インデックスを使用しています
      • myDictionary[key] = value
      • MyObject value = myDictionary[key]
  • nullキー
    • JavaのHashMapがnullキーを許可あなたが重複するキー
      • JavaのHashMapは、新しいものと既存の値を置き換えます追加
    • ヌルキーを追加しようとした場合の
    • .NETのDictionaryArgumentNullExceptionをスローします。
    • は、インデックス付けを[]にすると、既存の値を新しい値に置き換えます。 Addメソッドを使用すると、代わりにArgumentExceptionがスローされます。存在しないキー
      • JavaのHashMapはnullを返します取得しようとすると
    • .NETのDictionaryKeyNotFoundExceptionを投げます。
      MyObject value = null; if (!myDictionary.TryGetValue(key, value)) { /* key doesn't exist */ }

Dictionary年代は、前の二つの問題に対処することができますContainsKey方法があります:あなたはこれを避けるために、代わりに[]インデックスのTryGetValue方法を使用することができます。

+7

JAVA HashMapでnull値とnullキーを許可する完全一致はありません。http://download.oracle.com/javase/1.4.2/docs/api/java/util/HashMap.html –

+3

はい、ディクショナリは近いですが正確ではありません。 – Powerlord

+9

重複したキーを追加するとき、 'Dictionary'は例外をスローします。 –

4

HashtableクラスのMSDNに関するドキュメントをチェックしてください。

キーのハッシュコードに基づいて編成されたキーと値のペアの集合を表します。

また、スレッドセーフではありません。

+20

'Dictionary 'は、コンパイル時の型チェックのため、また値型のボクシングを必要としないため好ましいです。 – Thorarin

34

C# equivalent to Java HashMap

から私は「ヌル」キーを受け入れた辞書を必要としますが、ネイティブ一つでないように思わので、私は自分自身を書かれています。実際はとてもシンプルです。私はDictionaryから継承し、 "null"キーの値を保持するプライベートフィールドを追加して、インデクサーを上書きしました。これは次のようになります:

public class NullableDictionnary : Dictionary<string, string> 
{ 
    string null_value; 

    public StringDictionary this[string key] 
    { 
     get 
     { 
      if (key == null) 
      { 
       return null_value; 
      } 
      return base[key]; 
     } 
     set 
     { 
      if (key == null) 
      { 
       null_value = value; 
      } 
      else 
      { 
       base[key] = value; 
      } 
     } 
    } 
} 

将来的に誰かに役立つことを願っています。

==========

私はこの形式に変更

public class NullableDictionnary : Dictionary<string, object> 
+4

オブジェクトを型パラメータにすることでジェネリックステーマを続行できませんでしたか? – colithium

+0

これは機能しません。 public StringDictionary this [文字列キー] {... は にする必要があります。public String this [文字列キー] {。またベース[キー]は私の試行では機能しません。私はIDictionaryを実装し、グローバルなプライベートディクショナリオブジェクトを持ち、メソッドのそれぞれについてヌルケースを処理することをお勧めします。 –

+4

なぜあなたは辞書のスペルミスを忘れてしまったのだろうと思います。 –

7

私はあなたが "codaddictのアルゴリズム"

"の例でそれを理解するのに役立ちましょう in C# 'は、C#で' ハッシュマップ in Java 'である。

一部の実装は異なります。よりよく理解するには、下の例を参照してください。

Map<Integer, Integer> pairs = new HashMap<Integer, Integer>(); 

はC#辞書を宣言:

Dictionary<int, int> Pairs = new Dictionary<int, int>(); 

ロケーションから値を取得する:

pairs.get(input[i]); // in Java 
Pairs[input[i]];  // in C# 

位置に値を設定する:

pairs.put(k - input[i], input[i]); // in Java 
Pairs[k - input[i]] = input[i]; // in C# 
のJava HashMapを宣言

全体的な例は、Codaddictのアルゴリズムの下で見ることができます。

codaddictのJavaにおけるアルゴリズム:C#で

import java.util.HashMap; 

public class ArrayPairSum { 

    public static void printSumPairs(int[] input, int k) 
    { 
     Map<Integer, Integer> pairs = new HashMap<Integer, Integer>(); 

     for (int i = 0; i < input.length; i++) 
     { 
      if (pairs.containsKey(input[i])) 
       System.out.println(input[i] + ", " + pairs.get(input[i])); 
      else 
       pairs.put(k - input[i], input[i]); 
     } 

    } 

    public static void main(String[] args) 
    { 
     int[] a = { 2, 45, 7, 3, 5, 1, 8, 9 }; 
     printSumPairs(a, 10); 

    } 
} 

Codaddictのアルゴリズム

using System; 
using System.Collections.Generic; 

class Program 
{ 
    static void checkPairs(int[] input, int k) 
    { 
     Dictionary<int, int> Pairs = new Dictionary<int, int>(); 

     for (int i = 0; i < input.Length; i++) 
     { 
      if (Pairs.ContainsKey(input[i])) 
      { 
       Console.WriteLine(input[i] + ", " + Pairs[input[i]]); 
      } 
      else 
      { 
       Pairs[k - input[i]] = input[i]; 
      } 
     } 
    } 
    static void Main(string[] args) 
    { 
     int[] a = { 2, 45, 7, 3, 5, 1, 8, 9 }; 
     //method : codaddict's algorithm : O(n) 
     checkPairs(a, 10); 
     Console.Read(); 
    } 
} 
0

答えは

辞書

です私の機能で

テイクを見、そのシンプルなアドオンは、リストは、私はちょうど私の2セントを与えたいと思った

public static bool HasDuplicates<T>(IList<T> items) 
    { 
     Dictionary<T, bool> mp = new Dictionary<T, bool>(); 
     for (int i = 0; i < items.Count; i++) 
     { 
      if (mp.ContainsKey(items[i])) 
      { 
       return true; // has duplicates 
      } 
      mp.Add(items[i], true); 
     } 
     return false; // no duplicates 
    } 
0

重複項目が含まれている場合、この関数はfalseを返し辞書

内で最も重要なメンバ関数を使用しています。
これは@Powerlordの答えによるものです。

nullの代わりに"null"を挿入します。

private static Dictionary<string, string> map = new Dictionary<string, string>(); 

public static void put(string key, string value) 
{ 
    if (value == null) value = "null"; 
    map[key] = value; 
} 

public static string get(string key, string defaultValue) 
{ 
    try 
    { 
     return map[key]; 
    } 
    catch (KeyNotFoundException e) 
    { 
     return defaultValue; 
    } 
} 

public static string get(string key) 
{ 
    return get(key, "null"); 
} 
0

ハッシュテーブルを使用しますが、タイプセーフです。また、

int a = map.get(key); 
//continue with your logic 

ためのJavaコードは、最高のC#で、このように符号化される

int a; 
if(dict.TryGetValue(key, out a)){ 
//continue with your logic 
} 

この方法では、スコープ変数の必要性を「」ブロックの内部をすることができますし、後で必要になる場合は、ブロックの外側に引き続きアクセスできます。