tôi sẽ làm một phương pháp khuyến nông:
public static class DictionaryExt
{
public static IEnumerable<T> PartialMatch<T>(this Dictionary<string, T> dictionary, string partialKey)
{
// This, or use a RegEx or whatever.
IEnumerable<string> fullMatchingKeys =
dictionary.Keys.Where(currentKey => currentKey.Contains(partialKey));
List<T> returnedValues = new List<T>();
foreach (string currentKey in fullMatchingKeys)
{
returnedValues.Add(dictionary[currentKey]);
}
return returnedValues;
}
}
Các "chi phí" thêm giá trị vào từ điển sẽ không thay đổi, nhưng chi phí thu hồi sẽ cao hơn, nhưng chỉ khi bạn biết bạn đang đi với một phần phù hợp.
Btw, tôi chắc chắn bạn có thể chuyển đổi điều này trong một biểu thức Lambda đơn lẻ, nhưng khái niệm vẫn giữ nguyên.
Chỉnh sửa: Trong ví dụ của bạn, phương pháp này sẽ trả về 2 danh sách giá trị, nhưng bạn có thể thay đổi nó để hợp nhất các danh sách. Dưới đây là phương pháp mở rộng bạn có thể làm:
public static IEnumerable<T> PartialMatch<T>(
this Dictionary<string, IEnumerable<T>> dictionary,
string partialKey)
{
// This, or use a RegEx or whatever.
IEnumerable<string> fullMatchingKeys =
dictionary.Keys.Where(currentKey => currentKey.Contains(partialKey));
List<T> returnedValues = new List<T>();
foreach (string currentKey in fullMatchingKeys)
{
returnedValues.AddRange(dictionary[currentKey]);
}
return returnedValues;
}
Chỉnh sửa 2: Hãy đến với suy nghĩ của nó, bạn cũng có thể làm cho nó chung chung hơn. Với phương pháp mở rộng tiếp theo, nó sẽ làm việc trên bất kỳ từ điển, chừng nào mà bạn cung cấp một comparer
đó kiểm tra những gì bạn có ý nghĩa bởi "phù hợp với phần":
public static IEnumerable<TValue> PartialMatch<TKey, TValue>(
this Dictionary<TKey, IEnumerable<TValue>> dictionary,
TKey partialKey,
Func<TKey, TKey, bool> comparer)
{
// This, or use a RegEx or whatever.
IEnumerable<TKey> fullMatchingKeys =
dictionary.Keys.Where(currentKey => comparer(partialKey, currentKey));
List<TValue> returnedValues = new List<TValue>();
foreach (TKey currentKey in fullMatchingKeys)
{
returnedValues.AddRange(dictionary[currentKey]);
}
return returnedValues;
}
Tôi nghĩ rằng nhiều câu trả lời dưới đây cho thấy mọi người đang giả định những thứ khác nhau cho "chuỗi con" có nghĩa là gì. Tôi giả sử từ bình luận của bạn về 11 rằng bạn có nghĩa là một chuỗi con thực sự chung mà không nhất thiết là một tiền tố, hậu tố, chỉ là một [năm | tháng | ngày], và không phải là một regex? –
@J Trana - bạn là chính xác, tôi có nghĩa là một chuỗi con thực sự chung chung. – LeopardSkinPillBoxHat
@LeopardSkinPillBoxHat, bạn có thể vui lòng đăng những giải pháp cuối cùng mà bạn đã đi cùng với? – EndlessSpace