Yanıtlar:
Dictionary
muhtemelen en yakın olanıdır. (Java'nın arayüzüne benzeyen) arayüzü System.Collections.Generic.Dictionary
uygular .System.Collections.Generic.IDictionary
Map
Dikkat etmeniz gereken bazı önemli farklılıklar:
put
veget
myMap.put(key, value)
MyObject value = myMap.get(key)
[]
öğeleri ayarlamak / almak için endeksleme
kullanırmyDictionary[key] = value
MyObject value = myDictionary[key]
null
anahtarlar
HashMap
boş anahtarlara izin vermesiDictionary
bir atar ArgumentNullException
Eğer boş anahtarı eklemeye çalışırsanızHashMap
mevcut değeri yenisiyle değiştirir.Dictionary
kullanırsanız yenisi ile mevcut değerini değiştirecektir []
indeksleme. Add
Yöntemi kullanırsanız , bunun yerine bir ArgumentException
.HashMap
null değerini döndürür.Dictionary
bir atacağım KeyNotFoundException
. Bundan kaçınmak TryGetValue
için []
dizin oluşturma yerine yöntemi kullanabilirsiniz :MyObject value = null;
if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }
Dictionary
'nin ContainsKey
önceki iki problemle başa çıkmasına yardımcı olabilecek bir yöntemi vardır.
Dictionary
çoğaltılmış anahtar eklerken İstisnalar atar.
if (!myDictionary.TryGetValue(key, value))
out
ikinci argüman için bir ihtiyacı var . Yaniif (!myDictionary.TryGetValue(key, out value))
Gönderen Java HashMap C # eşdeğer
"Null" anahtarını kabul eden bir sözlüğe ihtiyacım vardı, ama yerel bir tane yok gibi görünüyor, bu yüzden kendim yazdım. Aslında çok basit. Dictionary'den devralındım, "null" anahtarının değerini tutmak için özel bir alan ekledim, sonra dizinleyicinin üzerine yazdım. Bu böyle devam ediyor :
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;
}
}
}
}
Umarım bu gelecekte birine yardımcı olur.
==========
Bu formatta değiştirdim
public class NullableDictionnary : Dictionary<string, object>
"Codaddict algoritması" örneği ile anlamana yardım edeyim
' C #' da Sözlük 'paralel evrende' Java'da Hashmap'dir .
Bazı uygulamalar farklıdır. Daha iyi anlamak için aşağıdaki örneğe bakın.
Java HashMap'in Bildirilmesi:
Map<Integer, Integer> pairs = new HashMap<Integer, Integer>();
C # Sözlüğü:
Dictionary<int, int> Pairs = new Dictionary<int, int>();
Bir konumdan değer alma:
pairs.get(input[i]); // in Java
Pairs[input[i]]; // in C#
Konumda bir değer ayarlama:
pairs.put(k - input[i], input[i]); // in Java
Pairs[k - input[i]] = input[i]; // in C#
Genel Bir Örnek, Codaddict algoritmasının altından görülebilir.
codaddict'in Java algoritması:
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 algoritması 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();
}
}
Hashtable sınıfı için MSDN'deki belgelere bakın .
Anahtarın karma koduna göre düzenlenmiş bir anahtar ve değer çiftleri koleksiyonunu temsil eder.
Ayrıca, bunun iş parçacığı için güvenli olmadığını unutmayın.
Dictionary<TKey, TValue>
Derleme zamanı türü denetimi ve değer türlerinin boksunu gerektirmediği için tercih edilir.
Sözlük Kullan - hashtable kullanıyor ancak typesafe.
Ayrıca, için Java kodunuz
int a = map.get(key);
//continue with your logic
en iyi C # ile bu şekilde kodlanacaktır:
int a;
if(dict.TryGetValue(key, out a)){
//continue with your logic
}
Bu şekilde, bir blok içindeki "a" değişkeninin ihtiyacını karşılayabilirsiniz ve daha sonra ihtiyacınız varsa blok dışında da erişilebilir.
cevap
Sözlük
benim fonksiyon bakmak, onun basit eklemek Sözlük içindeki en önemli üye fonksiyonları kullanır
Liste Yinelenen öğeler içeriyorsa bu işlev false değerini döndürür
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
}
Sadece iki sentimi vermek istedim.
Bu @ Powerlord'un cevabına göre.
Boş dizeler yerine "null" koyar .
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");
}