Odpowiedzi:
Dictionary
jest prawdopodobnie najbliższy. System.Collections.Generic.Dictionary
implementuje System.Collections.Generic.IDictionary
interfejs (podobny do Map
interfejsu Java ).
Kilka istotnych różnic, o których powinieneś wiedzieć:
put
i get
do ustawiania / pobierania elementów
myMap.put(key, value)
MyObject value = myMap.get(key)
[]
indeksowania do ustawiania / pobierania elementów
myDictionary[key] = value
MyObject value = myDictionary[key]
null
Klucze
HashMap
pozwala na klucze zeroweDictionary
rzuca, ArgumentNullException
jeśli spróbujesz dodać klucz zerowyHashMap
zastąpi istniejącą wartość nową.Dictionary
zastąpi istniejącą wartość nową, jeśli korzystasz z []
indeksowania. Jeśli użyjesz tej Add
metody, zamiast niej wyrzuci ArgumentException
.HashMap
zwróci null.Dictionary
rzuca KeyNotFoundException
. Możesz użyć TryGetValue
metody zamiast []
indeksowania, aby tego uniknąć:MyObject value = null;
if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }
Dictionary
ma ContainsKey
metodę, która może pomóc w rozwiązaniu dwóch poprzednich problemów.
Dictionary
zgłasza wyjątki podczas dodawania duplikatu klucza.
if (!myDictionary.TryGetValue(key, value))
potrzebuje out
drugiego argumentu. Więcif (!myDictionary.TryGetValue(key, out value))
Z języka C # odpowiadającego Java HashMap
Potrzebowałem Słownika, który akceptuje klucz „zerowy”, ale wydaje się, że nie ma natywnego, więc napisałem własny. W rzeczywistości jest to bardzo proste. Odziedziczyłem po Dictionary, dodałem prywatne pole do przechowywania wartości klucza „null”, a następnie zastąpiłem indeksator. To wygląda tak:
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;
}
}
}
}
Mam nadzieję, że to pomoże komuś w przyszłości.
==========
Zmodyfikowałem go do tego formatu
public class NullableDictionnary : Dictionary<string, object>
Pozwól, że pomogę ci to zrozumieć na przykładzie „algorytmu codaddict”
„ Dictionary in C #” to „ Hashmap in Java” w równoległym wszechświecie.
Niektóre implementacje są różne. Zobacz poniższy przykład, aby lepiej zrozumieć.
Deklarowanie Java HashMap:
Map<Integer, Integer> pairs = new HashMap<Integer, Integer>();
Deklarowanie słownika C #:
Dictionary<int, int> Pairs = new Dictionary<int, int>();
Uzyskiwanie wartości z lokalizacji:
pairs.get(input[i]); // in Java
Pairs[input[i]]; // in C#
Ustawienie wartości w lokalizacji:
pairs.put(k - input[i], input[i]); // in Java
Pairs[k - input[i]] = input[i]; // in C#
Ogólny przykład można zaobserwować poniżej algorytmu Codaddict.
algorytm codaddict w Javie:
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);
}
}
Algorytm Codaddict w C #
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();
}
}
Sprawdź dokumentację MSDN dla klasy Hashtable .
Reprezentuje kolekcję par klucz-wartość, które są zorganizowane na podstawie kodu skrótu klucza.
Pamiętaj również, że nie jest to bezpieczne dla wątków.
Dictionary<TKey, TValue>
jest preferowane ze względu na sprawdzanie typu czasu kompilacji i ponieważ nie wymaga boksu typów wartości.
Użyj słownika - używa tablicy mieszającej, ale jest bezpieczny dla typów.
Ponadto twój kod Java dla
int a = map.get(key);
//continue with your logic
najlepiej będzie kodować w C # w ten sposób:
int a;
if(dict.TryGetValue(key, out a)){
//continue with your logic
}
W ten sposób możesz zawęzić zakres potrzeby zmiennej „a” wewnątrz bloku i jest ona nadal dostępna poza blokiem, jeśli będziesz jej potrzebować później.
odpowiedź to
Słownik
spójrz na moją funkcję, jej proste dodawanie wykorzystuje najważniejsze funkcje składowe w Słowniku
ta funkcja zwraca false, jeśli lista zawiera elementy Duplikaty
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
}
Chciałem tylko dać dwa centy.
Jest to zgodne z odpowiedzią @Powerlord.
Ustawia „null” zamiast łańcuchów o wartości 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");
}