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 ContainsKeyvà 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 KeyNotFoundngoại lệ trong trường hợp từ điển không chứa khóa của bạn.
Theo đề nghị, ContainsKeylà biện pháp phòng ngừa thích hợp. TryGetValuecũ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 ContainsKeyphươ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 TryGetValuephương pháp như được mô tả trong câu trả lời của Jon Skeet.
GetValueElseAddcá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]
TryGetValuesẽ 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 ContainsKeylà 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ị.
TryGetValuetrong 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 catchtoán tử tương tự như toán tử liên nullkế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.
TryGetValuelà đủ, sử dụng valuethay 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ố.