Tôi đã thử kiểm tra null nhưng trình biên dịch cảnh báo rằng điều kiện này sẽ không bao giờ xảy ra. Tôi nên tìm kiếm gì?
Tôi đã thử kiểm tra null nhưng trình biên dịch cảnh báo rằng điều kiện này sẽ không bao giờ xảy ra. Tôi nên tìm kiếm gì?
Câu trả lời:
Giả sử bạn muốn để có được những giá trị nếu chìa khóa không tồn tại, sử dụng Dictionary<TKey, TValue>.TryGetValue
:
int value;
if (dictionary.TryGetValue(key, out value))
{
// Key was in dictionary; "value" contains corresponding value
}
else
{
// Key wasn't in dictionary; "value" is now 0
}
(Sử dụng ContainsKey
và sau đó trình lập chỉ mục làm cho nó nhìn chìa khóa lên hai lần, điều này khá vô nghĩa.)
Lưu ý rằng ngay cả khi bạn đang sử dụng các kiểu tham chiếu, việc kiểm tra null sẽ không hoạt động - trình lập chỉ mục cho Dictionary<,>
sẽ đưa ra một ngoại lệ nếu bạn yêu cầu một khóa bị thiếu, thay vì trả về null. (Đây là sự khác biệt lớn giữa Dictionary<,>
và Hashtable
.)
ContainsKey
, điều đó đúng, bởi vì nó cũng phải trích xuất giá trị. Nó không thực hiện hai lần tra cứu.
Từ điển ném ra một KeyNotFound
ngoại lệ trong trường hợp từ điển không chứa khóa của bạn.
Theo đề nghị, ContainsKey
là biện pháp phòng ngừa thích hợp. TryGetValue
cũng có hiệu quả.
Điều này cho phép từ điển lưu trữ giá trị null hiệu quả hơn. Nếu không nó hoạt động theo cách này, việc kiểm tra kết quả null từ toán tử [] sẽ chỉ ra giá trị null HOẶC sự không tồn tại của khóa đầu vào là không tốt.
Nếu bạn chỉ đang kiểm tra trước khi cố gắng thêm một giá trị mới, hãy sử dụng ContainsKey
phương pháp:
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}
Nếu bạn đang kiểm tra xem giá trị có tồn tại hay không, hãy sử dụng TryGetValue
phương pháp như được mô tả trong câu trả lời của Jon Skeet.
GetValueElseAdd
các phương thức mà bạn cung cấp giá trị (hoặc a Func<TValue>
) để lưu độ phân giải trên Chèn nếu bạn định thêm nếu nó không có ở đó. Tôi đoán lý do mà has not đã làm cho nó vào libs NET là vì Add đường dẫn là ít thường xuyên nếu bạn đang sử dụng nó trong một bộ nhớ cache stylee]
TryGetValue
sẽ tốt hơn, nhưng nếu bạn muốn kiểm tra xem từ điển có chứa khóa hay không để tránh bổ sung trùng lặp, tôi sẽ nói ContainsKey
là tốt (nếu không tốt hơn).
Bạn nên kiểm tra Dictionary.ContainsKey (khóa int) trước khi cố gắng lấy ra giá trị.
Dictionary<int, int> myDictionary = new Dictionary<int, int>();
myDictionary.Add(2,4);
myDictionary.Add(3,5);
int keyToFind = 7;
if(myDictionary.ContainsKey(keyToFind))
{
myValueLookup = myDictionay[keyToFind];
// do work...
}
else
{
// the key doesn't exist.
}
TryGetValue
. Rất may, tôi làm ngay bây giờ, vì vậy tôi sẽ biết trong tương lai. Tôi sẽ để nguyên câu trả lời này, mặc dù cuộc thảo luận 'cos rất có giá trị.
TryGetValue
trong biểu thức lambda. Mặc dù điều đó khiến tôi nghĩ rằng một phần mở rộng mới cho C # sẽ là một catch
toán tử tương tự như toán tử liên null
kết.
Một lớp trợ giúp rất hữu ích:
public static class DictionaryHelper
{
public static TVal Get<TKey, TVal>(this Dictionary<TKey, TVal> dictionary, TKey key, TVal defaultVal = default(TVal))
{
TVal val;
if( dictionary.TryGetValue(key, out val) )
{
return val;
}
return defaultVal;
}
}
ContainsKey là thứ bạn đang tìm kiếm.
Bạn có thể nên sử dụng:
if(myDictionary.ContainsKey(someInt))
{
// do something
}
Lý do tại sao bạn không thể kiểm tra null là vì khóa ở đây là một loại giá trị.
int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;
Nếu khóa có trong từ điển, nó trả về giá trị của khóa, ngược lại nó trả về 0.
Hy vọng, mã này sẽ giúp bạn.
TryGetValue
là đủ, sử dụng value
thay vìresult
Hãy xem xét tùy chọn đóng gói từ điển cụ thể này và cung cấp một phương thức để trả về giá trị cho khóa đó:
public static class NumbersAdapter
{
private static readonly Dictionary<string, string> Mapping = new Dictionary<string, string>
{
["1"] = "One",
["2"] = "Two",
["3"] = "Three"
};
public static string GetValue(string key)
{
return Mapping.ContainsKey(key) ? Mapping[key] : key;
}
}
Sau đó, bạn có thể quản lý hành vi của từ điển này.
Ví dụ ở đây: nếu từ điển không có khóa, nó sẽ trả về khóa mà bạn truyền theo tham số.