ไม่มีวิธีระบุ a StringComparer
ณ จุดที่คุณพยายามรับค่า หากคุณคิดเกี่ยวกับมัน"foo".GetHashCode()
และ"FOO".GetHashCode()
แตกต่างกันโดยสิ้นเชิงดังนั้นจึงไม่มีวิธีที่เหมาะสมที่คุณสามารถใช้ตัวพิมพ์เล็กและใหญ่ได้
อย่างไรก็ตามคุณสามารถสร้างพจนานุกรมตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ได้ตั้งแต่แรกโดยใช้: -
var comparer = StringComparer.OrdinalIgnoreCase;
var caseInsensitiveDictionary = new Dictionary<string, int>(comparer);
หรือสร้างพจนานุกรมตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ใหม่ที่มีเนื้อหาของพจนานุกรมตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ที่มีอยู่ (ถ้าคุณแน่ใจว่าไม่มีการชนตัวพิมพ์ใหญ่และตัวพิมพ์ใหญ่): -
var oldDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
var newDictionary = new Dictionary<string, int>(oldDictionary, comparer);
พจนานุกรมใหม่นี้จากนั้นจะใช้GetHashCode()
การดำเนินการเกี่ยวกับการStringComparer.OrdinalIgnoreCase
เพื่อให้comparer.GetHashCode("foo")
และcomparer.GetHashcode("FOO")
ให้คุณมีค่าเท่ากัน
อีกทางเลือกหนึ่งหากมีเพียงไม่กี่องค์ประกอบในพจนานุกรมและ / หรือคุณต้องการค้นหาเพียงครั้งเดียวหรือสองครั้งคุณสามารถถือว่าพจนานุกรมต้นฉบับเป็นIEnumerable<KeyValuePair<TKey, TValue>>
และเพียงแค่ทำซ้ำมัน: -
var myKey = ...;
var myDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
var value = myDictionary.FirstOrDefault(x => String.Equals(x.Key, myKey, comparer)).Value;
หรือหากคุณต้องการโดยไม่มี LINQ: -
var myKey = ...;
var myDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
int? value;
foreach (var element in myDictionary)
{
if (String.Equals(element.Key, myKey, comparer))
{
value = element.Value;
break;
}
}
สิ่งนี้ช่วยให้คุณประหยัดค่าใช้จ่ายในการสร้างโครงสร้างข้อมูลใหม่ แต่ในทางกลับกันค่าใช้จ่ายของการค้นหาคือ O (n) แทนที่จะเป็น O (1)