Câu trả lời:
Dictionarycó lẽ là gần nhất System.Collections.Generic.Dictionarythực hiện System.Collections.Generic.IDictionarygiao diện (tương tự như Mapgiao diện của Java ).
Một số khác biệt đáng chú ý mà bạn cần lưu ý:
putvà getcác phương thức để thiết lập / nhận các mục
myMap.put(key, value)MyObject value = myMap.get(key)[]lập chỉ mục để thiết lập / nhận các mục
myDictionary[key] = valueMyObject value = myDictionary[key]null chìa khóa
HashMapcho phép các khóa nullDictionaryném ArgumentNullExceptionnếu bạn cố thêm khóa nullHashMapsẽ thay thế giá trị hiện tại bằng giá trị mới.Dictionarysẽ thay thế giá trị hiện tại bằng giá trị mới nếu bạn sử dụng []lập chỉ mục. Nếu bạn sử dụng Addphương thức, nó sẽ thay vào đó ArgumentException.HashMapsẽ trả về null.Dictionarysẽ ném một KeyNotFoundException. Bạn có thể sử dụng TryGetValuephương pháp thay vì []lập chỉ mục để tránh điều này:MyObject value = null;
if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }DictionaryCó một ContainsKeyphương pháp có thể giúp giải quyết hai vấn đề trước đó.
Dictionaryném Ngoại lệ khi thêm khóa trùng lặp.
if (!myDictionary.TryGetValue(key, value))cần một outđối số thứ hai. Vì vậyif (!myDictionary.TryGetValue(key, out value))
Từ C # tương đương với Java HashMap
Tôi cần một cuốn Từ điển chấp nhận khóa "null", nhưng dường như không có từ gốc, vì vậy tôi đã tự viết. Thật ra nó rất đơn giản. Tôi đã kế thừa từ điển, thêm một trường riêng để giữ giá trị cho khóa "null", sau đó ghi đè lên bộ chỉ mục. Nó như thế này:
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;
}
}
}
}
Mong rằng điều này sẽ giúp ai đó trong tương lai.
==========
Tôi đã sửa đổi nó sang định dạng này
public class NullableDictionnary : Dictionary<string, object>
Hãy để tôi giúp bạn hiểu về nó với một ví dụ về "thuật toán codaddict"
' Từ điển trong C #' là ' Hashmap trong Java' trong vũ trụ song song.
Một số thực hiện là khác nhau. Xem ví dụ dưới đây để hiểu rõ hơn.
Khai báo Java HashMap:
Map<Integer, Integer> pairs = new HashMap<Integer, Integer>();
Khai báo từ điển C #:
Dictionary<int, int> Pairs = new Dictionary<int, int>();
Lấy giá trị từ một vị trí:
pairs.get(input[i]); // in Java
Pairs[input[i]]; // in C#
Đặt giá trị tại vị trí:
pairs.put(k - input[i], input[i]); // in Java
Pairs[k - input[i]] = input[i]; // in C#
Một ví dụ tổng thể có thể được quan sát từ bên dưới thuật toán của Codaddict.
thuật toán của codaddict trong 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);
}
}
Thuật toán của Codaddict trong 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();
}
}
Kiểm tra tài liệu về MSDN cho lớp Hashtable .
Đại diện cho một tập hợp các cặp khóa và giá trị được tổ chức dựa trên mã băm của khóa.
Ngoài ra, hãy nhớ rằng đây không phải là chủ đề an toàn.
Dictionary<TKey, TValue>tốt hơn là vì kiểm tra kiểu thời gian biên dịch và vì nó không yêu cầu quyền anh của các loại giá trị.
Sử dụng từ điển - nó sử dụng hashtable nhưng là loại an toàn.
Ngoài ra, mã Java của bạn cho
int a = map.get(key);
//continue with your logic
sẽ được mã hóa tốt nhất theo C # theo cách này:
int a;
if(dict.TryGetValue(key, out a)){
//continue with your logic
}
Bằng cách này, bạn có thể phạm vi nhu cầu của biến "a" bên trong một khối và nó vẫn có thể truy cập được bên ngoài khối nếu bạn cần nó sau này.
câu trả lời là
Từ điển
hãy xem chức năng của tôi, phần bổ sung đơn giản của nó sử dụng hầu hết các hàm thành viên quan trọng bên trong Dictionary
Hàm này trả về false nếu danh sách chứa các mục trùng lặp
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
}
Tôi chỉ muốn cho tôi hai xu.
Đây là theo câu trả lời của @Powerlord.
Đặt "null" thay vì chuỗi 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");
}