Другое - ICollection dictionary wrapper 

Page / - Изменено Alexandr Fokin в 2023/06/30 12:00 

ICollection dictionary wrapper 
Изменено Alexandr Fokin
в 2023/06/30 12:00

Оглавление

 
public class CollectionDictionaryWrapper<TKey, TValue>
    : ICollection<TValue>, 
    IReadOnlyCollection<TValue>
{        
   private readonly Func<TValue, TKey> _keySelector;
   public IDictionary<TKey, TValue> Data { get; private set; }

   public DictionaryWrapperCollection(
        IDictionary<TKey, TValue> dict,
        Func<TValue, TKey> keySelector
        )
    {
        Data = dict;
        _keySelector = keySelector;
    }

   public DictionaryWrapperCollection(
        Func<TValue, TKey> keySelector
        )
        : this(
           new Dictionary<TKey, TValue>(),
            keySelector
        )
    { }

   #region ICollection

   public int Count => Data.Count;

   public bool IsReadOnly => Data.IsReadOnly;

   public void Add(TValue item)
    {
        Data.Add(_keySelector(item), item);
    }

   public void Clear()
    {
        Data.Clear();
    }

   public bool Contains(TValue item)
    {
       //Можно сделать проверку по ключу, пока сделаю по KeyValuePair

       return Data
            .Contains(new KeyValuePair<TKey, TValue>(_keySelector(item), item));
    }

   public void CopyTo(TValue[] array, int arrayIndex)
    {
        Data.Values.CopyTo(array, arrayIndex);
    }

   public IEnumerator<TValue> GetEnumerator()
    {
       return Data.Values.GetEnumerator();
    }

   public bool Remove(TValue item)
    {
       return Data.Remove(_keySelector(item));
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
       return Data.Values.GetEnumerator();
    }

   #endregion
}	
Можно использовать для EntityFramework | EntityFrameworkCore.
Позволяет работать с коллекцией по уникальному ключу, при этом EF будет использовать интерфейс ICollection.