亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在C#項目中實現一個帶通知的List<T>

發布時間:2021-03-01 17:02:56 來源:億速云 閱讀:220 作者: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

富顺县| 丹阳市| 洱源县| 江门市| 元朗区| 蒲城县| 栾城县| 鹿泉市| 灵武市| 漳平市| 专栏| 信丰县| 正定县| 灵台县| 将乐县| 富阳市| 大英县| 玉门市| 石河子市| 墨玉县| 隆尧县| 宝应县| 长沙县| 龙里县| 澄城县| 福泉市| 上林县| 嘉祥县| 闸北区| 阿尔山市| 文昌市| 万源市| 岳阳县| 女性| 普兰县| 宜宾县| 库伦旗| 布尔津县| 铅山县| 盖州市| 襄樊市|