ฉันพยายามตรวจสอบค่าว่าง แต่คอมไพเลอร์เตือนว่าเงื่อนไขนี้จะไม่เกิดขึ้น ฉันควรมองหาอะไร
ฉันพยายามตรวจสอบค่าว่าง แต่คอมไพเลอร์เตือนว่าเงื่อนไขนี้จะไม่เกิดขึ้น ฉันควรมองหาอะไร
คำตอบ:
สมมติว่าคุณต้องการที่จะได้รับค่าถ้าคีย์จะมีอยู่ใช้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
}
(ใช้ContainsKey
แล้วตัวสร้างดัชนีทำให้มันดูคีย์ขึ้นสองครั้งซึ่งค่อนข้างไม่มีจุดหมาย)
โปรดทราบว่าแม้ว่าคุณจะใช้ประเภทการอ้างอิงการตรวจสอบค่าว่างจะไม่ทำงาน - ตัวสร้างดัชนีDictionary<,>
จะให้ข้อยกเว้นหากคุณขอคีย์ที่หายไปแทนที่จะส่งคืนค่าว่าง (นี่คือความแตกต่างอย่างมากระหว่างDictionary<,>
และHashtable
)
ContainsKey
ซึ่งก็จริงเพราะมันต้องดึงค่าออกมาเช่นกัน มันไม่ได้ทำการค้นหาสองครั้ง
พจนานุกรมจะแสดงKeyNotFound
ข้อยกเว้นในกรณีที่พจนานุกรมไม่มีคีย์ของคุณ
ตามที่แนะนำContainsKey
คือข้อควรระวังที่เหมาะสม TryGetValue
ยังมีประสิทธิภาพ
สิ่งนี้ช่วยให้พจนานุกรมสามารถจัดเก็บค่าว่างได้อย่างมีประสิทธิภาพมากขึ้น หากไม่มีการทำงานในลักษณะนี้การตรวจสอบผลลัพธ์ที่เป็นโมฆะจากตัวดำเนินการ [] จะบ่งชี้ว่าเป็นค่าว่างหรือการไม่มีอยู่ของคีย์อินพุตซึ่งไม่เป็นผลดี
หากคุณเพิ่งตรวจสอบก่อนที่จะพยายามเพิ่มค่าใหม่ให้ใช้ContainsKey
วิธีการ:
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}
หากคุณกำลังตรวจสอบว่ามีค่าอยู่ให้ใช้TryGetValue
วิธีการตามที่อธิบายไว้ในคำตอบของ Jon Skeet
GetValueElseAdd
วิธีการที่คุณให้ค่า (หรือ a Func<TValue>
) เพื่อบันทึกความละเอียดในส่วนแทรกหากคุณจะเพิ่มหากไม่มี ฉันเดาว่าสาเหตุที่ไม่ได้ทำให้มันกลายเป็น. NET libs เป็นเพราะ Add path นั้นไม่บ่อยถ้าคุณใช้มันในรูปแบบแคช]
TryGetValue
จะดีกว่า แต่ถ้าคุณต้องการตรวจสอบว่าพจนานุกรมมีคีย์หรือไม่เพื่อหลีกเลี่ยงการเพิ่มซ้ำฉันจะบอกว่าContainsKey
ดีพอ ๆ กัน (ถ้าไม่ดีกว่า)
คุณควรตรวจสอบ Dictionary.ContainsKey (คีย์ int) ก่อนที่จะพยายามดึงค่าออกมา
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
. โชคดีที่ฉันทำตอนนี้ดังนั้นฉันจะรู้ในอนาคต ฉันจะปล่อยให้คำตอบนี้เหมือนเดิมแม้ว่า 'การสนทนาจะมีค่า
TryGetValue
ในนิพจน์แลมบ์ดาได้ แม้ว่านั่นจะทำให้ฉันคิดว่าส่วนขยายใหม่ของ C # น่าจะเป็นcatch
ตัวดำเนินการที่คล้ายกับnull
ตัวดำเนินการรวมกัน
คลาสผู้ช่วยมีประโยชน์:
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;
}
}
มีคีย์คือสิ่งที่คุณกำลังมองหา
คุณควรใช้:
if(myDictionary.ContainsKey(someInt))
{
// do something
}
สาเหตุที่คุณไม่สามารถตรวจสอบค่าว่างได้ก็คือคีย์ในที่นี้คือประเภทค่า
int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;
หากคีย์มีอยู่ในพจนานุกรมจะส่งคืนค่าของคีย์มิฉะนั้นจะส่งกลับ 0
หวังว่ารหัสนี้จะช่วยคุณได้
TryGetValue
ก็เพียงพอแล้วให้ใช้value
แทนresult
พิจารณาตัวเลือกในการห่อหุ้มพจนานุกรมนี้และระบุวิธีการคืนค่าสำหรับคีย์นั้น:
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;
}
}
จากนั้นคุณสามารถจัดการพฤติกรรมของพจนานุกรมนี้ได้
ตัวอย่างเช่นที่นี่: หากพจนานุกรมไม่มีคีย์จะส่งคืนคีย์ที่คุณส่งผ่านพารามิเตอร์