Словарь, где значение является анонимным типом в C#

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' для скорости, хотя чем больше символов вы пропустите, тем меньше уникальных ключей может быть сгенерировано.

Возможно, это не идеальное решение, но оно достаточно быстрое для моих нужд и предотвращает создание почти всех английских слов, оскорбительных или нет.

38
задан abatishchev 29 September 2014 в 15:45
поделиться

3 ответа

Вы не можете напрямую объявить такой тип словаря (есть кладжи, но они для развлечения и новизны только для целей), но если ваши данные поступают из источника IEnumerable или IQueryable, вы можете получить их, используя оператор LINQ ToDictionary и проецируя требуемый ключ и (анонимно введенное) значение из элементов последовательности:

var intToAnon = sourceSequence.ToDictionary(
    e => e.Id,
    e => new { e.Column, e.Localized });
44
ответ дан 27 November 2019 в 03:36
поделиться

Как Итоулсон сказал , вы не можете объявить такого зверя, но можете действительно создайте один:

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 = "Доллар" });
}

Непонятно, почему вы действительно хотите использовать такой код .

18
ответ дан 27 November 2019 в 03:36
поделиться

Вы можете исправить ошибку

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;
    }
}
3
ответ дан 27 November 2019 в 03:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: