C# 如何实现一个带通知的List
背景
在很多场景下面我们需要在集合发生变化的时候能够通过一个事件对外进行通知,默认的List
实现
这里贴出具体的代码实现
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
namespaceXXX.XXX.Core.Utils
{
publicclassItemsChangedEventArgs:EventArgs
{
publicIListRemovedItems{get;privateset;}
publicIListAddedItems{get;privateset;}
publicItemsChangedEventArgs(IListremovedItems,IListaddItems)
{
RemovedItems=removedItems;
AddedItems=addItems;
}
}
publicdelegatevoidListItemsChangedEventHandler(objectsender,ItemsChangedEventArgsargs);
publicclassNotifyList:List
{
publicstaticNotifyListEmpty
{
get{returnnewNotifyList();}
}
publiceventListItemsChangedEventHandlerItemsChanged;
protectedvoidOnItemsChanged(IListremovedItems,IListaddedItems)
{
ListItemsChangedEventHandlertemp=ItemsChanged;
temp?.Invoke(this,newItemsChangedEventArgs(removedItems,addedItems));
}
publicnewvoidAdd(Titem)
{
base.Add(item);
OnItemsChanged(Empty,newList{item});
}
publicnewvoidAddRange(IEnumerablecollection)
{
base.AddRange(collection);
OnItemsChanged(Empty,collection.ToList());
}
publicnewvoidClear()
{
T[]array=newT[this.Count];
this.CopyTo(array);
base.Clear();
OnItemsChanged(array.ToList(),Empty);
}
publicnewboolRemove(Titem)
{
boolret=base.Remove(item);
if(ret)OnItemsChanged(newList{item},Empty);
returnret;
}
publicnewintRemoveAll(Predicatematch)
{
IListremovedItems=FindAll(match);
intcount=base.RemoveAll(match);
if(removedItems.Count!=count)
{
thrownewException("[NotifyList][RemoveAll][Thenumberofelementsfoundbythepredicatedoesnotmatchthenumberofelementsremoved.]");
}
OnItemsChanged(removedItems,Empty);
returncount;
}
publicnewvoidRemoveAt(intindex)
{
TremovedItem=this[index];
base.RemoveAt(index);
OnItemsChanged(newList{removedItem},Empty);
}
publicnewvoidRemoveRange(intindex,intcount)
{
IEnumerablerange=this.Skip(index+1).Take(count);
base.RemoveRange(index,count);
OnItemsChanged(range.ToList(),Empty);
}
}
}
注意事项
1基类中Add这些方法都是非虚方法,这里不能使用重载,所以在自己实现的每一个方法中需要使用new关键字进行覆盖。
2 在具体使用的时候需要订阅ItemsChanged事件。
以上就是C#如何实现一个带通知的List
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。