Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная_работа_4_НикитинаДС.docx
Скачиваний:
20
Добавлен:
15.06.2021
Размер:
40.97 Кб
Скачать

MagazineChangedEventArgs.Cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace DashaLabs

{

delegate void MagazinesChangedHandler<TKey> (MagazinesChangedEventArgs<TKey> args);

class MagazinesChangedEventArgs<TKey> : EventArgs

{

public string CollectionName { get; set; }

public ChangeCollectionEventType EventType { get; set; }

public string ChangedProperty { get; set; }

public TKey ElementKey { get; set; }

public MagazinesChangedEventArgs(string collectionName, ChangeCollectionEventType eventType, string changedProperty, TKey elementKey)

{

CollectionName = collectionName;

EventType = eventType;

ChangedProperty = changedProperty;

ElementKey = elementKey;

}

public override string ToString()

{

return string.Format(

"Collection name: {0}\nEvent type: {1}\nChanged property: {2}\nElement key: {3}",

CollectionName,

EventType,

ChangedProperty,

ElementKey.ToString()

);

}

}

}

MagazineCollection.Cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.ComponentModel;

using System.Text;

using System.Threading.Tasks;

namespace DashaLabs

{

delegate TKey KeySelector<TKey>(Magazine mg);

class MagazineCollection<TKey>

{

private Dictionary<TKey, Magazine> magazines;

private Dictionary<TKey, PropertyChangedEventHandler> handlers;

private KeySelector<TKey> keySelector;

public string MagazineCollectionName { get; set; }

public event MagazinesChangedHandler<TKey> Notify;

public MagazineCollection(KeySelector<TKey> keySelector, string collectionName)

{

this.keySelector = keySelector;

MagazineCollectionName = collectionName;

magazines = new Dictionary<TKey, Magazine>();

handlers = new Dictionary<TKey, PropertyChangedEventHandler>();

}

public bool Replace(Magazine mOld, Magazine mNew)

{

if(!magazines.ContainsValue(mOld))

{

return false;

}

Dictionary<TKey, Magazine>.KeyCollection keys = magazines.Keys;

foreach (TKey key in keys)

{

if(Equals(magazines[key], mOld))

{

magazines.Remove(key);

magazines.Add(key, mNew);

PropertyChangedEventHandler handler;

handlers.TryGetValue(key, out handler);

mOld.PropertyChanged -= handler;

handlers.Remove(key);

PropertyChangedEventHandler newHandler = GetHandler(key);

handlers.Add(key, newHandler);

mNew.PropertyChanged += newHandler;

Notify?.Invoke(new MagazinesChangedEventArgs<TKey>(MagazineCollectionName, ChangeCollectionEventType.Replace, "", key));

return true;

}

}

return true;

}

public PropertyChangedEventHandler GetHandler(TKey key)

{

return (sender, args) => Notify?.Invoke(new MagazinesChangedEventArgs<TKey>(MagazineCollectionName, ChangeCollectionEventType.Property, args.PropertyName, key));

}

public void AddDefaults() { }

public void AddMagazines(params Magazine[] magazines)

{

foreach (Magazine entry in magazines)

{

TKey key = keySelector(entry);

Notify?.Invoke(new MagazinesChangedEventArgs<TKey>(MagazineCollectionName, ChangeCollectionEventType.Add, "", key));

PropertyChangedEventHandler handler = GetHandler(key);

handlers.Add(key, handler);

entry.PropertyChanged += handler;

this.magazines.Add(key, entry);

}

}

public override string ToString()

{

string result = "";

foreach (KeyValuePair<TKey, Magazine> entry in magazines)

{

result += entry.Value.ToString() + '\n';

}

return result;

}

public string ToShortString()

{

string result = "";

foreach (KeyValuePair<TKey, Magazine> entry in magazines)

{

result += entry.Value.ToShortString() + '\n';

}

return result;

}

public double MaxScore

{

get

{

return magazines.Max(x => x.Value.AverageScore);

}

}

public IEnumerable<KeyValuePair<TKey, Magazine>> FrequencyGroup(Frequency period)

{

return magazines.Where(x => x.Value.Period == period);

}

public IEnumerable<IGrouping<Frequency, KeyValuePair<TKey, Magazine>>> Groups

{

get

{

return magazines.GroupBy(x => x.Value.Period);

}

}

}

}