ถ้าฉันมีDictionary<String,...>
มันเป็นไปได้ที่จะทำวิธีการเช่นContainsKey
กรณีตาย?
ดูเหมือนจะเกี่ยวข้องกัน แต่ฉันไม่เข้าใจอย่างถูกต้อง: c # Dictionary: การทำให้ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ผ่านการประกาศ
ถ้าฉันมีDictionary<String,...>
มันเป็นไปได้ที่จะทำวิธีการเช่นContainsKey
กรณีตาย?
ดูเหมือนจะเกี่ยวข้องกัน แต่ฉันไม่เข้าใจอย่างถูกต้อง: c # Dictionary: การทำให้ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ผ่านการประกาศ
คำตอบ:
ดูเหมือนจะเกี่ยวข้องกัน แต่ฉันไม่เข้าใจอย่างถูกต้อง: c # Dictionary: การทำให้ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ผ่านการประกาศ
มันเกี่ยวข้องกันอย่างแน่นอน การแก้ปัญหาคือบอกอินสแตนซ์ของพจนานุกรมไม่ให้ใช้วิธีเปรียบเทียบสตริงมาตรฐาน (ซึ่งต้องตรงตามตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก) แต่ใช้ตัวพิมพ์เล็กและตัวพิมพ์เล็ก สิ่งนี้ทำโดยใช้Constructor ที่เหมาะสม :
var dict = new Dictionary<string, YourClass>(
StringComparer.InvariantCultureIgnoreCase);
ตัวสร้างคาดว่าIEqualityComparer
อันไหนที่บอกพจนานุกรมถึงวิธีการเปรียบเทียบกุญแจ
StringComparer.InvariantCultureIgnoreCase
ให้IEqualityComparer
อินสแตนซ์ที่เปรียบเทียบสตริงในลักษณะที่ไม่สนใจขนาดตัวพิมพ์
var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
myDic.Add("HeLlo", "hi");
if (myDic.ContainsKey("hello"))
Console.WriteLine(myDic["hello"]);
มีโอกาสน้อยที่การจัดการกับพจนานุกรมของคุณจะถูกดึงจากบุคคลที่สามหรือ dll ภายนอก ใช้ linq
YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))
Any
ไปSingleOrDefault
คุณจะไม่ได้รับnull
กลับถ้ามันไม่ได้อยู่แทนคุณจะได้รับ KeyValuePair มีทั้งที่สำคัญและตั้งค่าให้เป็นnull
!
Contains
ดูเหมือนว่าจะเป็นกรณีใช้งานที่เฉพาะเจาะจงกับสิ่งที่คุณกำลังทำอยู่ในขณะนั้น ในฐานะที่เป็นคำตอบที่เป็นประโยชน์โดยทั่วไปฉันคิดว่าEquals
ดีกว่า และเมื่อทราบเหมือนกันว่าแทนที่จะทำซ้ำสตริงกับมันจะดียิ่งขึ้นกับการใช้งานToLower()
StringComparison.xxxCase
dict.Keys.Contains("bla", appropriate comparer)
LINQ โอเวอร์โหลดเพื่อความสะดวกในการใช้งาน
ฉันพบปัญหาแบบเดียวกับที่ฉันต้องการพจนานุกรม caseINSitive ในตัวควบคุม ASP.NET Core
ฉันเขียนวิธีการต่อซึ่งทำเคล็ดลับ บางทีนี่อาจเป็นประโยชน์สำหรับผู้อื่นเช่นกัน ...
public static IDictionary<string, TValue> ConvertToCaseInSensitive<TValue>(this IDictionary<string, TValue> dictionary)
{
var resultDictionary = new Dictionary<string, TValue>(StringComparer.InvariantCultureIgnoreCase);
foreach (var (key, value) in dictionary)
{
resultDictionary.Add(key, value);
}
dictionary = resultDictionary;
return dictionary;
}
วิธีใช้ส่วนขยาย:
myDictionary.ConvertToCaseInSensitive();
จากนั้นรับค่าจากพจนานุกรมด้วย:
myDictionary.ContainsKey("TheKeyWhichIsNotCaseSensitiveAnymore!");
หากคุณไม่มีการควบคุมในการสร้างอินสแตนซ์สมมติว่าวัตถุของคุณถูก desterilized จาก json ฯลฯ คุณสามารถสร้างคลาส wrapper ที่สืบทอดมาจากคลาสพจนานุกรม
public class CaseInSensitiveDictionary<TValue> : Dictionary<string, TValue>
{
public CaseInSensitiveDictionary() : base(StringComparer.OrdinalIgnoreCase){}
}
StringComparer.InvariantCultureIgnoreCase
? มันทำในสิ่งที่มันบอกว่า ...