7 ответов:
Dictionaryнаверное, ближе.System.Collections.Generic.DictionaryосуществляетSystem.Collections.Generic.IDictionaryинтерфейс (который похож на JavaMapинтерфейс).некоторые заметные различия, которые вы должны знать:
- добавление/получение предметов
в Java есть
putиgetметоды настройки / получения элементов
myMap.put(key, value)MyObject value = myMap.get(key)- C# ' s Словарь использует
[]индексирование для установки/получения товаров
myDictionary[key] = valueMyObject value = myDictionary[key]nullключи
- Java
HashMapпозволяет нулевые ключиDictionaryвыдаетArgumentNullExceptionесли вы пытаетесь добавить нулевой ключдобавление дубликата ключа
- Java
HashMapзаменит существующее значение на новое один.Dictionaryзаменит существующее значение на новое, если вы используете[]индексирование. Если вы используетеAddметод, вместо этого он броситArgumentException.попытка получить несуществующий ключ
- Java
HashMapвернет null.DictionaryброситKeyNotFoundException. Вы можете использоватьTryGetValueметод вместо[]индексации, чтобы избежать это:MyObject value = null; if (!myDictionary.TryGetValue(key, value)) { /* key doesn't exist */ }
Dictionary's естьContainsKeyметод, который может помочь справиться с двумя предыдущими проблемами.
С C# эквивалентно Java HashMap
мне нужен был словарь, который принимал" нулевой " ключ, но, похоже, нет родного, поэтому я написал свой собственный. На самом деле все очень просто. Я унаследовал от словаря, добавил частное поле для хранения значения для ключа "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>
позвольте мне помочь вам понять это на примере "алгоритма codaddict"
'словарь в C# 'is'Hashmap в Java в параллельной вселенной.
некоторые реализации отличаются. Смотрите пример ниже, чтобы лучше понять.
Объявление Java HashMap:
Map<Integer, Integer> pairs = new HashMap<Integer, Integer>();Объявление Словаря C#:
Dictionary<int, int> Pairs = new Dictionary<int, int>();получение значения из a местонахождение:
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#общий пример можно наблюдать снизу алгоритма Codaddict.
алгоритм codaddict в Java:
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 в 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(); } }
проверьте документацию на MSDN для Hashtable класса.
представляет коллекцию пар ключ-значение, которые организованы на основе хэш-кода ключа.
кроме того, имейте в виду, что это не потокобезопасными.
использовать словарь-он использует hashtable, но является типобезопасным.
кроме того, ваш Java-код
int a = map.get(key); //continue with your logicбудет лучше всего закодирован в C# таким образом:
int a; if(dict.TryGetValue(key, out a)){ //continue with your logic }таким образом, вы можете определить необходимость переменной "a" внутри блока, и она по-прежнему доступна за пределами блока, если вам это нужно позже.
ответ
словарь
взгляните на мою функцию, ее простое добавление использует самые важные функции-члены внутри словаря
эта функция возвращает false, если список содержит дубликаты элементов
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 }
Я просто хотел отдать свои два цента.
Это согласно ответу @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"); }
Comments