温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在C#项目中实现一个带通知的List<T>

发布时间:2021-03-01 17:02:56 来源:亿速云 阅读:265 作者:Leah 栏目:开发技术

怎么在C#项目中实现一个带通知的List<T>?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

实现

using System; using System.Collections.Generic; using System.Linq; namespace XXX.XXX.Core.Utils {   public class ItemsChangedEventArgs<T> : EventArgs   {     public IList<T> RemovedItems { get; private set; }     public IList<T> AddedItems { get; private set; }     public ItemsChangedEventArgs(IList<T> removedItems, IList<T> addItems)     {       RemovedItems = removedItems;       AddedItems = addItems;     }   }   public delegate void ListItemsChangedEventHandler<T>(object sender, ItemsChangedEventArgs<T> args);   public class NotifyList<T> : List<T>   {     public static NotifyList<T> Empty     {       get { return new NotifyList<T>(); }     }     public event ListItemsChangedEventHandler<T> ItemsChanged;     protected void OnItemsChanged(IList<T> removedItems, IList<T> addedItems)     {       ListItemsChangedEventHandler<T> temp = ItemsChanged;       temp?.Invoke(this, new ItemsChangedEventArgs<T>(removedItems, addedItems));     }     public new void Add(T item)     {       base.Add(item);       OnItemsChanged(Empty, new List<T> { item });     }     public new void AddRange(IEnumerable<T> collection)     {       base.AddRange(collection);       OnItemsChanged(Empty, collection.ToList());     }     public new void Clear()     {       T[] array = new T[this.Count];       this.CopyTo(array);       base.Clear();       OnItemsChanged(array.ToList(), Empty);     }     public new bool Remove(T item)     {       bool ret = base.Remove(item);       if (ret) OnItemsChanged(new List<T> { item }, Empty);       return ret;     }     public new int RemoveAll(Predicate<T> match)     {       IList<T> removedItems = FindAll(match);       int count = base.RemoveAll(match);       if (removedItems.Count != count)       {         throw new Exception("[NotifyList][RemoveAll][The number of elements found by the predicate does not match the number of elements removed.]");       }       OnItemsChanged(removedItems, Empty);       return count;     }     public new void RemoveAt(int index)     {       T removedItem = this[index];       base.RemoveAt(index);       OnItemsChanged(new List<T> { removedItem }, Empty);     }     public new void RemoveRange(int index, int count)     {       IEnumerable<T> range = this.Skip(index + 1).Take(count);       base.RemoveRange(index, count);       OnItemsChanged(range.ToList(), Empty);     }   } }

 注意事项

  1 基类中Add这些方法都是非虚方法,这里不能使用重载,所以在自己实现的每一个方法中需要使用 new 关键字进行覆盖。

       2  在具体使用的时候需要订阅ItemsChanged事件。

看完上述内容,你们掌握怎么在C#项目中实现一个带通知的List<T>的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI