IEnumerable không có phương thức Count


81

Tôi có phương pháp sau:

public bool IsValid
{
  get { return (GetRuleViolations().Count() == 0); }
}

public IEnumerable<RuleViolation> GetRuleViolations(){
  //code here
}

Tại sao khi tôi làm .Count()ở trên, nó được gạch dưới màu đỏ?

Tôi gặp lỗi sau:

Lỗi 1 'System.Collections.Generic.IEnumerable' không chứa định nghĩa cho 'Count' và không có phương thức mở rộng nào 'Count' chấp nhận đối số đầu tiên thuộc loại 'System.Collections.Generic.IEnumerable' (bạn có thiếu một sử dụng chỉ thị hay tham chiếu lắp ráp?) c: \ users \ a \ Documents \ visual studio 2010 \ Projects \ NerdDinner \ NerdDinner \ Models \ Dinner.cs 15 47 NerdDinner


Có cùng một vấn đề. Vì lý do nào đó, bạn không thể nhấp chuột phải vào phần này và chọn "Giải quyết ..." để khắc phục sự cố :(
micahhoover

Thở dài! Tôi đã bao gồm System.Linq nhưng vẫn gặp lỗi này. (Mặc dù anh ta thông báo lỗi đặt tên đối số đầu tiên là "System.Linq.IQueryable".)
Hot Licks

Câu trả lời:


158

Bạn thêm:

using System.Linq;

ở đầu nguồn của bạn và đảm bảo rằng bạn có tham chiếu đến cụm System.Core.

Count()là một phương thức mở rộng được cung cấp bởi System.Linq.Enumerablelớp tĩnh cho LINQ to Objects và System.Linq.Queryablecho LINQ to SQL và các trình cung cấp ngoài quy trình khác.

CHỈNH SỬA: Trên thực tế, việc sử dụng Count()ở đây tương đối kém hiệu quả (ít nhất là trong LINQ to Objects). Tất cả những gì bạn muốn biết là liệu có bất kỳ yếu tố nào hay không, phải không? Trong trường hợp đó, Any()phù hợp hơn:

public bool IsValid
{
  get { return !GetRuleViolations().Any(); }
}

Nếu tham chiếu này gây ra lỗi cho bạn, hãy xác minh rằng Khung mục tiêu của dự án của bạn (trong thuộc tính dự án, tab Ứng dụng) được đặt thành .NET Framework 3.5 hoặc 4. Các phương thức mở rộng sẽ không hoạt động trên 2.0 trở xuống.
willvv

1
Tôi đã sử dụng System.Linq; nhưng nó không giải quyết được sự cố của tôi ... làm cách nào để đảm bảo rằng tôi có tham chiếu đến cụm System.Core?
aherlambang

Oh nevermind, tôi cố định nó ... sự khác nhau giữa System.data.linq và System.Linq là gì
aherlambang

@Alexander: Chúng hoàn toàn là không gian tên khác nhau. System.Data.Linqdành riêng cho LINQ to SQL.
Jon Skeet

1
@skyfoot: Không, nó thực sự sẽ không. Nó sẽ cho bạn 4. Nếu bạn nghĩ khác, vui lòng đăng một câu hỏi với một chương trình ngắn nhưng đầy đủ để giải thích vấn đề.
Jon Skeet

7

Any()hoặc Count()các phương thức trong Linq chỉ hoạt động với các kiểu chung chung.

IEnumerable<T>

Nếu bạn có một đơn giản IEnumerablemà không có một loại, hãy thử sử dụng

IEnumerable<object> 

thay thế.


2

IEnumerationkhông có một phương thức được gọi Count(). Nó chỉ là một loại "chuỗi các yếu tố". Ví dụ: sử dụng Listnếu bạn cần số phần tử một cách rõ ràng. Nếu bạn sử dụng Linq, hãy nhớ rằng phương thức mở rộng Count()có thể thực sự đếm lại số phần tử mỗi khi bạn gọi nó.


-1

Làm thế nào về:

public bool IsValid
{
    get { return (GetRuleViolations().Cast<RuleViolation>().Count() == 0); }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.