2011-06-23 31 views
7
List<string> list = new List<string>() {"a", "b", "c"}; 
IEnumerable<string> enumerable = list; 

int c1 = list.Count; 
int c2 = list.Count(); 
int c3 = enumerable.Count(); 

Có sự khác biệt về hiệu suất và triển khai giữa 3 câu lệnh cuối cùng này không? Sẽ list.Count() hoạt động kém hơn hoặc giống như list.Count và có quan trọng nếu tham chiếu thuộc loại IEnumerable<string>?Có sự khác biệt giữa Count() (phần mở rộng LINQ) và Danh sách <T> .Count

Trả lời

10

Hãy nhìn với Reflector:

public static int Count<TSource>(this IEnumerable<TSource> source) 
{ 
    if (source == null) 
    { 
     throw Error.ArgumentNull("source"); 
    } 
    ICollection<TSource> is2 = source as ICollection<TSource>; 
    if (is2 != null) 
    { 
     return is2.Count; 
    } 
    ICollection is3 = source as ICollection; 
    if (is3 != null) 
    { 
     return is3.Count; 
    } 
    int num = 0; 
    using (IEnumerator<TSource> enumerator = source.GetEnumerator()) 
    { 
     while (enumerator.MoveNext()) 
     { 
      num++; 
     } 
    } 
    return num; 
} 

Vì vậy, nếu bạn thực hiện IEnumerable<T>ICollection<T> hoặc ICollection, nó sẽ trả lại Count tài sản.

0

Tôi giả sử nó hoạt động như thế này: Danh sách giữ số đếm của riêng nó trong một biến. Đếm() lặp qua IEnumerable để đếm số phần tử. Điều đó sẽ làm cho List.Count hiệu quả hơn.

+0

Nếu IEnumerable là một ICollection (chẳng hạn như danh sách) do đó có thuộc tính .Count thì Linq sử dụng điều này làm lối tắt khi bạn sử dụng phương thức .Count(). Điều này có nghĩa là bất cứ điều gì bạn sử dụng không thực sự quan trọng. – Dolbz

+0

Điều này là sai. Count() được mã hóa để nó chỉ lặp lại để đếm nếu phần tử bạn đang gọi Count() không thực hiện chính ICollection. –

3

Phương pháp đếm Linq đủ thông minh để không lặp qua bộ sưu tập cơ bản nếu nó triển khai giao diện ICollection và do đó đã có thuộc tính Đếm.

1

Việc thực hiện số đếm trên IEnumerable kiểm tra đầu tiên nếu danh sách liệt kê cũng thực hiện ICollection<T> trong đó T là thông số chung của danh sách liệt kê.

Nếu có, nó trả về ICollection<T>.Count.

Nếu không, nó sẽ kiểm tra xem nó có thực hiện ICollection hay không. Nếu nó trả về ICollection.Count.

Nếu nó không thực hiện không phải của những người đó phải lặp qua toàn bộ danh sách và đếm, và điều này có thể là một hoạt động tốn kém cho một danh sách lớn.

List<string> tuy nhiên triển khai ICollection<string> và do đó hiệu suất sẽ giống nhau.

Các vấn đề liên quan