Câu trả lời:
Dictionary
có lẽ là gần nhất System.Collections.Generic.Dictionary
thực hiện System.Collections.Generic.IDictionary
giao diện (tương tự như Map
giao diện của Java ).
Một số khác biệt đáng chú ý mà bạn cần lưu ý:
put
và get
cá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] = value
MyObject value = myDictionary[key]
null
chìa khóa
HashMap
cho phép các khóa nullDictionary
ném ArgumentNullException
nếu bạn cố thêm khóa nullHashMap
sẽ thay thế giá trị hiện tại bằng giá trị mới.Dictionary
sẽ 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 Add
phương thức, nó sẽ thay vào đó ArgumentException
.HashMap
sẽ trả về null.Dictionary
sẽ ném một KeyNotFoundException
. Bạn có thể sử dụng TryGetValue
phươ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 */ }
Dictionary
Có một ContainsKey
phương pháp có thể giúp giải quyết hai vấn đề trước đó.
Dictionary
né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");
}