Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

การได้จำนวนสมาชิกจริงใน ArrayList ใน C#

ArrayList มี property Count คืนค่าจำนวนสมาชิกที่มีอยู่จริง (ต่างจาก Capacity ที่เป็นความจุภายใน) ทำงานใน O(1) นอกจากนี้ยังมี Clear() ลบทั้งหมด และ TrimToSize() ลด capacity ให้เท่ากับ count

ตัวอย่างโค้ดที่ 1: หลาย ArrayList และ Capacity

using System;
using System.Collections;

public class Demo
{
    public static void Main(string[] args)
    {
        ArrayList list1 = new ArrayList();
        list1.Add("A");
        list1.Add("B");
        list1.Add("C");
        list1.Add("D");
        list1.Add("E");
        list1.Add("F");
        list1.Add("G");
        list1.Add("H");
        list1.Add("I");

        Console.WriteLine("Elements in ArrayList1...");
        foreach (string res in list1)
        {
            Console.WriteLine(res);
        }

        ArrayList list2 = new ArrayList();
        list2.Add("A");
        list2.Add("B");
        list2.Add("C");
        list2.Add("D");
        list2.Add("E");
        list2.Add("F");
        list2.Add("G");
        list2.Add("H");
        list2.Add("I");

        Console.WriteLine("Elements in ArrayList2...");
        foreach (string res in list2)
        {
            Console.WriteLine(res);
        }

        ArrayList list3 = new ArrayList();
        Console.WriteLine("Current capacity of ArrayList3: " + list3.Capacity);
        list3 = list2; // Reference assignment
        Console.WriteLine("Current capacity of ArrayList3 (Updated) " + list3.Capacity);
        Console.WriteLine("Is ArrayList3 equal to ArrayList2? = " + list3.Equals(list2));
        Console.WriteLine("Count of elements in ArrayList2 = " + list2.Count);
        list2.Clear();
        Console.WriteLine("Count of elements in ArrayList2 (Updated) = " + list2.Count);
    }
}

ผลลัพธ์

Elements in ArrayList1...
A
B
C
D
E
F
G
H
I
Elements in ArrayList2...
A
B
C
D
E
F
G
H
I
Current capacity of ArrayList3: 0
Current capacity of ArrayList3: 16
Is ArrayList3 equal to ArrayList2? = True
Count of elements in ArrayList2 = 9
Count of elements in ArrayList2 (Updated) = 0

ตัวอย่างโค้ดที่ 2: Capacity และ Equals

using System;
using System.Collections;

public class Demo
{
    public static void Main(string[] args)
    {
        ArrayList list1 = new ArrayList();
        list1.Add("A");
        list1.Add("B");
        list1.Add("C");
        list1.Add("D");
        list1.Add("E");
        list1.Add("F");
        list1.Add("G");
        list1.Add("H");
        list1.Add("I");

        Console.WriteLine("Current capacity of ArrayList1: " + list1.Capacity);
        Console.WriteLine("Elements in ArrayList1...");
        foreach (string res in list1)
        {
            Console.WriteLine(res);
        }

        ArrayList list2 = new ArrayList();
        list2.Add("A");
        list2.Add("B");
        list2.Add("C");
        list2.Add("D");
        list2.Add("E");
        list2.Add("F");
        list2.Add("G");
        list2.Add("H");
        list2.Add("I");

        Console.WriteLine("Elements in ArrayList2...");
        foreach (string res in list2)
        {
            Console.WriteLine(res);
        }

        ArrayList list3 = new ArrayList();
        list3 = list2; // Reference assignment
        Console.WriteLine("Is ArrayList3 equal to ArrayList2? = " + list3.Equals(list2));
    }
}

ผลลัพธ์

Current capacity of ArrayList1: 16
Elements in ArrayList1...
A
B
C
D
E
F
G
H
I
Elements in ArrayList2...
A
B
C
D
E
F
G
H
I
Is ArrayList3 equal to ArrayList2? = True

Count vs Capacity

Propertyคำอธิบาย
Countจำนวนสมาชิกที่มีอยู่จริง (logical size)
Capacityขนาด array ภายใน (physical size) - ขยายอัตโนมัติ: 0→4→8→16→32→64...
  • Count <= Capacity เสมอ
  • เมื่อ Add จน Count > Capacity จะ allocate array ใหญ่ขึ้น (ปกติคูณ 2) และ copy ข้อมูล
  • TrimToSize() ลด Capacity ให้เท่ากับ Count (ประหยัด memory)
  • Constructor new ArrayList(capacity) กำหนด capacity เริ่มต้นได้

Equals() ของ ArrayList

  • เป็น Reference Equality - true ก็ต่อเมื่อชี้อ็อบเจ็กต์เดียวกัน
  • list3 = list2; list3.Equals(list2) → true
  • สอง ArrayList ที่มีเนื้อหาเหมือนกันแต่คนละ instance → false
  • ใช้ list1.Cast<object>().SequenceEqual(list2.Cast<object>()) (LINQ) สำหรับ value equality

แนวทางปฏิบัติ: ใช้ List<T> แทน


// แทน ArrayList
var list = new List { "A", "B", "C" };
Console.WriteLine(list.Count); // 3
Console.WriteLine(list.Capacity); // 4 (หรือมากกว่า)
list.TrimExcess(); // ลด capacity