最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c#系列 list詳情

 更新時間:2021年10月25日 09:25:02   作者:敖毛毛  
這篇文章主要介紹了c#系列 list,list 本質(zhì)是一個數(shù)組,。就跟我們操作系統(tǒng)一樣,提前申請內(nèi)存大小。所以我們程序一般都有一個申請內(nèi)存,實際使用內(nèi)存,內(nèi)存碎片這幾個概念,下面?zhèn)z看文章詳細內(nèi)容吧

這里以list為介紹:

private static readonly T[] s_emptyArray = new T[0];
public List()
{
  this._items = List<T>.s_emptyArray;
}

list 本質(zhì)是一個數(shù)組。

同樣我們可以指定容量,如果我們知道了我們大概需要多少數(shù)據(jù),那么我們可以指定一下,這樣避免了resize的損耗。

就跟我們操作系統(tǒng)一樣,提前申請內(nèi)存大小。所以我們程序一般都有一個申請內(nèi)存,實際使用內(nèi)存,內(nèi)存碎片這幾個概念。

添加也是很簡單哈

public void Add(T item)
{
  ++this._version;
  T[] items = this._items;
  int size = this._size;
  if ((uint) size < (uint) items.Length)
  {
 this._size = size + 1;
 items[size] = item;
  }
  else
 this.AddWithResize(item);
}

判斷是否滿了,如果沒滿直接存到數(shù)組里面去,如果滿了,那么resize一下。

看下resize:

private void AddWithResize(T item)
{
  int size = this._size;
  this.EnsureCapacity(size + 1);
  this._size = size + 1;
  this._items[size] = item;
}


然后看一下擴容步驟:

private void EnsureCapacity(int min)
{
  if (this._items.Length >= min)
 return;
  int num = this._items.Length == 0 ? 4 : this._items.Length * 2;
  if ((uint) num > 2146435071U)
 num = 2146435071;
  if (num < min)
 num = min;
  this.Capacity = num;
}

首先在做了一次判斷,判斷是否容量夠用,所以是size+1

if (this._items.Length >= min)
 return;


這里就有人問了外面不是判斷了,為什么里面還有判斷。

這個就是一些人喜歡談性能的地方了,認為多此一舉,如果里面不判斷那么就不是一個成熟的方法,提現(xiàn)不出方法的封閉性,因為方法的作用是之和參數(shù)打交道,外面是什么其實是不管的。

那么可以看出,一開始是4,然后后面就是翻倍了。

然后重點看下:

 this.Capacity = num;


這個this.Capacity 并不是普通的變量,而是一個屬性哈,不然你都納悶它是怎么擴容了。

public int Capacity
{
 get => _items.Length;
 set
 {
  if (value < _size)
  {
   ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.value, ExceptionResource.ArgumentOutOfRange_SmallCapacity);
  }

  if (value != _items.Length)
  {
   if (value > 0)
   {
    T[] newItems = new T[value];
    if (_size > 0)
    {
     Array.Copy(_items, newItems, _size);
    }
    _items = newItems;
   }
   else
   {
    _items = s_emptyArray;
   }
  }
 }
}

首先判斷了不能縮容,如果縮容直接異常,其次我們注意道這個Capacity piblic的,也就是說我們在外部就可以直接調(diào)用。

后面邏輯就很簡單創(chuàng)建一個新的數(shù)組,然后復制就ok了,然后重新賦值_items。

那么來看一下remove吧:

public bool Remove(T item)
{
 int index = IndexOf(item);
 if (index >= 0)
 {
  RemoveAt(index);
  return true;
 }

 return false;
}

首先是找到其位置:

public int IndexOf(T item)
 => Array.IndexOf(_items, item, 0, _size);

int IList.IndexOf(object? item)
{
 if (IsCompatibleObject(item))
 {
  return IndexOf((T)item!);
 }
 return -1;
}

可以看一下這個IsCompatibleObject,還是很有趣的。

private static bool IsCompatibleObject(object? value)
{
 // Non-null values are fine.  Only accept nulls if T is a class or Nullable<U>.
 // Note that default(T) is not equal to null for value types except when T is Nullable<U>.
 return (value is T) || (value == null && default(T) == null);
}

從這個說明,其實我們是可以傳空對象的。

static void Main(string[] args)
{
 List<object> lists = new List<object>();

 lists.Add(null);

 Console.WriteLine(lists.Count);

 lists.Remove(null);
 Console.ReadLine();
}



那么來看一下removeat吧:

public void RemoveAt(int index)
{
 if ((uint)index >= (uint)_size)
 {
  ThrowHelper.ThrowArgumentOutOfRange_IndexException();
 }
 _size--;
 if (index < _size)
 {
  Array.Copy(_items, index + 1, _items, index, _size - index);
 }
 if (RuntimeHelpers.IsReferenceOrContainsReferences<T>())
 {
  _items[_size] = default!;
 }
 _version++;
}

這里可以看出list的remove操作還是性能損耗很大的,尤其是大的list。

這里有沒有注意道一個_version,這個有什么作用呢?

當遍歷的時候我們就用的到

internal Enumerator(List<T> list)
{
 _list = list;
 _index = 0;
 _version = list._version;
 _current = default;
}

public void Dispose()
{
}

public bool MoveNext()
{
 List<T> localList = _list;

 if (_version == localList._version && ((uint)_index < (uint)localList._size))
 {
  _current = localList._items[_index];
  _index++;
  return true;
 }
 return MoveNextRare();
}

private bool MoveNextRare()
{
 if (_version != _list._version)
 {
  ThrowHelper.ThrowInvalidOperationException_InvalidOperation_EnumFailedVersion();
 }

 _index = _list._size + 1;
 _current = default;
 return false;
}

重點看上面的list,上面表面了,當我們使用foreach 進行遍歷的時候,如果我們進行了刪除或者添加,那么_version就會發(fā)生變化,那么可想而知會拋出異常。

例子:

static void Main(string[] args)
{
 List<object> lists = new List<object>();

 lists.Add("123456");

 lists.Add("1231246");

 lists.Add("dsadadsads");

 lists.Add("eqewqew");

 foreach (var item in lists)
 {
  if (item.ToString() == "1231246")
  {
   lists.Remove(item);
  }
 }

 Console.ReadLine();
}

然后就會拋出異常了。

那么這里就不介紹find了,find 就是遍歷數(shù)組,找出是否相等。

哦,對了講另外一個故事。

public int Count => _size;


count-1 就是當前插入的位置。

那么如果你想刪除某個元素的時候,那么你可以進行removeat 刪除,這樣避免了find。

那么非常值得注意的是如果刪除了其他元素,如果那么元素的位置小于你記錄的位置,那么應該是位置進行減一。

到此這篇關(guān)于c#系列 list詳情的文章就介紹到這了,更多相關(guān)c#系列 list內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#實現(xiàn)簡易的計算器

    C#實現(xiàn)簡易的計算器

    這篇文章主要為大家詳細介紹了C#實現(xiàn)簡易的計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • 重寫、隱藏基類(new, override)的方法

    重寫、隱藏基類(new, override)的方法

    重寫、隱藏基類(new, override)的方法,需要的朋友可以參考一下
    2013-03-03
  • c#數(shù)據(jù)類型基礎(chǔ)

    c#數(shù)據(jù)類型基礎(chǔ)

    C#里面的數(shù)據(jù)類型分為兩種:值類型和引用類型。
    2008-08-08
  • C#調(diào)用WebService的方法步驟

    C#調(diào)用WebService的方法步驟

    在日常工作中,如果涉及到與第三方進行接口對接,有的會使用WebService的方式,這篇文章主要講解在.NET?Framework中如何調(diào)用WebService,感興趣的小伙伴跟著小編一起來看看吧
    2025-03-03
  • C#12中的Collection expressions集合表達式語法糖詳解

    C#12中的Collection expressions集合表達式語法糖詳解

    C#12中引入了新的語法糖來創(chuàng)建常見的集合,并且可以使用..來解構(gòu)集合,將其內(nèi)聯(lián)到另一個集合中,下面就跟隨小編一起學習一下C#12中這些語法糖的使用吧
    2023-11-11
  • C#中使用WinRAR實現(xiàn)加密壓縮及解壓縮文件

    C#中使用WinRAR實現(xiàn)加密壓縮及解壓縮文件

    這篇文章主要介紹了C#中使用WinRAR實現(xiàn)加密壓縮及解壓縮文件,本文直接給出實例代碼,代碼中包含詳細注釋,需要的朋友可以參考下
    2015-07-07
  • 使用Linq注意事項避免報錯的方法

    使用Linq注意事項避免報錯的方法

    這篇文章主要介紹了使用Linq注意事項避免報錯的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • C# 如何添加錯誤日志信息

    C# 如何添加錯誤日志信息

    這篇文章主要介紹了C# 如何添加錯誤日志信息,錯誤日志是軟件用來記錄運行時出錯信息的文本文件。編程人員和維護人員等可以利用錯誤日志對系統(tǒng)進行調(diào)試和維護。
    2020-11-11
  • C#實現(xiàn)基于IE內(nèi)核的簡單瀏覽器完整實例

    C#實現(xiàn)基于IE內(nèi)核的簡單瀏覽器完整實例

    這篇文章主要介紹了C#實現(xiàn)基于IE內(nèi)核的簡單瀏覽器,較為詳細的分析了C#實現(xiàn)瀏覽器的原理與主要功能實現(xiàn)方法,并附帶完整實例供大家下載,需要的朋友可以參考下
    2015-07-07
  • C#發(fā)送和接收HTTP請求類HttpWebRequest的用法

    C#發(fā)送和接收HTTP請求類HttpWebRequest的用法

    這篇文章主要給大家介紹了關(guān)于C#發(fā)送和接收HTTP請求類HttpWebRequest用法的相關(guān)資料,C#中的HttpWebRequest是一個用于發(fā)送HTTP請求的類,它可以用于向Web服務器發(fā)送GET、POST、PUT、DELETE等請求,需要的朋友可以參考下
    2024-06-06

最新評論

孟村| 乐陵市| 淮南市| 上杭县| 垫江县| 周口市| 峡江县| 马关县| 四子王旗| 昭觉县| 滦南县| 满洲里市| 潍坊市| 赣州市| 焦作市| 德州市| 呼和浩特市| 绩溪县| 连南| 苏尼特右旗| 疏勒县| 临夏市| 博湖县| 衢州市| 南华县| 泸水县| 昌都县| 鸡东县| 福海县| 泽普县| 绥棱县| 漾濞| 区。| 芒康县| 阜平县| 息烽县| 双牌县| 绥棱县| 巩义市| 正定县| 咸丰县|