Microsoft исключает из своих ключей продуктов следующее:
0 1 2 5 A E I O U L N S Z
Я опускаю их в [0-9A-Z], и как только ключ сгенерирован, я сопоставляю с список, который я нашел из двухбуквенных комбинаций, наиболее распространенных на английском языке, и регенерируйте ключ, если есть совпадение. Для скорости я редактирую список буквенных пар, сначала выбрав из этого списка пары, которые уже запрещены из-за их включения символа в удаленный список («HE» не может существовать, если ключ генерируется из набора символов). который не включает «E»), затем преобразует некоторые из «E» в «3», как в «H3» вместо «HE» и т. д. Я также добавил несколько своих собственных, таких как «KK» и « CK 'для крайних случаев. При необходимости можно также опустить '3' для скорости, хотя чем больше символов вы пропустите, тем меньше уникальных ключей может быть сгенерировано.
Возможно, это не идеальное решение, но оно достаточно быстрое для моих нужд и предотвращает создание почти всех английских слов, оскорбительных или нет.
Вы не можете напрямую объявить такой тип словаря (есть кладжи, но они для развлечения и новизны только для целей), но если ваши данные поступают из источника IEnumerable или IQueryable, вы можете получить их, используя оператор LINQ ToDictionary и проецируя требуемый ключ и (анонимно введенное) значение из элементов последовательности:
var intToAnon = sourceSequence.ToDictionary(
e => e.Id,
e => new { e.Column, e.Localized });
Как Итоулсон сказал , вы не можете объявить такого зверя, но можете действительно создайте один:
static IDictionary<TKey, TValue> NewDictionary<TKey, TValue>(TKey key, TValue value)
{
return new Dictionary<TKey, TValue>();
}
static void Main(string[] args)
{
var dict = NewDictionary(new {ID = 1}, new { Column = "Dollar", Localized = "Доллар" });
}
Непонятно, почему вы действительно хотите использовать такой код .
Вы можете исправить ошибку
public static class ObjectExtensions
{
/// <summary>
/// Turn anonymous object to dictionary
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static IDictionary<string, object> ToDictionary(this object data)
{
var attr = BindingFlags.Public | BindingFlags.Instance;
var dict = new Dictionary<string, object>();
foreach (var property in data.GetType().GetProperties(attr))
{
if (property.CanRead)
{
dict.Add(property.Name, property.GetValue(data, null));
}
}
return dict;
}
}