2013-03-13 34 views
12

tôi đã sử dụng mã dưới đây để có một số mặt hàng từ IEnumerable, nhưng nó luôn luôn trở về nguồn như vô tính là 0 và thực sự có mục tồn tại trong IEnumerableLINQ với Skip và Take

private void GetItemsPrice(IEnumerable<Item> items, int customerNumber) 
{ 
    var a = items.Skip(2).Take(5); 
} 

Khi tôi cố gắng truy cập a số điện thoại này có số: 0. Có gì sai ở đây không?

enter image description here

+3

Có bao nhiêu mặt hàng _are_ trong bộ sưu tập ban đầu? –

+0

Không, tôi có một cái gì đó nhiều hơn, nhưng đối với câu hỏi của tôi này một mình đủ –

+0

Những mục nào chứa? –

Trả lời

18

Hãy nhớ rằng, rằng biến a trong mã của bạn là một truy vấn bản thân. Nó không phải là kết quả của việc thực hiện truy vấn. Khi bạn đang sử dụng ngay cửa sổ để xem truy vấn (trên thực tế có liên quan đến truy vấn mà đã trì hoãn thực hiện nếu không bạn sẽ có kết quả thay vì truy vấn), nó sẽ luôn hiển thị

{System.Linq.Enumerable.TakeIterator<int>} 
    count: 0 
    source: null 

Bạn có thể xác minh rằng với mã này, mà rõ ràng có đủ các mặt hàng:

int[] items = { 1, 2, 3, 4, 5, 6, 7 }; 
var a = items.Skip(2).Take(3); 

Vì vậy, bạn nên thực hiện truy vấn của bạn để xem kết quả thực hiện truy vấn. Viết trong Immediate Window:

a.ToList() 

Và bạn sẽ thấy kết quả thực hiện truy vấn:

Count = 3 
    [0]: 3 
    [1]: 4 
    [2]: 5 
+1

là vậy. http://msdn.microsoft.com/en-us/library/bb503062.aspx "Giá trị trả về ngay lập tức là một đối tượng lưu trữ tất cả thông tin cần thiết để thực hiện hành động. Truy vấn được biểu diễn bằng phương thức này không được thực hiện cho đến khi đối tượng được liệt kê bằng cách gọi trực tiếp phương thức GetEnumerator hoặc bằng cách sử dụng foreach " – Xaruth

+0

@Xaruth yes. Đó là những gì được gọi đơn giản là * truy vấn *: một đối tượng lưu trữ tất cả thông tin cần thiết để thực hiện tác vụ –

+0

. để chuyển nó thành tham số 'items.Skip (2) .Take (5)' sang phương thức khác. Tôi có cần sử dụng '.ToList()' để truyền tham số này làm tham số không? –

1

bạn phải kiểm tra nếu bạn đã ghi trong bộ sưu tập của bạn

private void GetItemsPrice(IEnumerable<Item> items, int customerNumber) 
{ 
    var a; 
    if(items.Count > 2) 
    a = items.Skip(2).Take(5); 
    else 
    MessageBos.Show("Error in Items number"); 
} 

này chỉ để thử nghiệm nếu probleme với số lượng mặt hàng.

CHỈNH SỬA: lý do duy nhất để có được .Count = 0 mục của bạn chứa ít hơn 3 mục!

bạn có thể kiểm tra điều này pls và đưa ra kết quả nhắn

MessageBox.Show("count Items in list:" + items.Count); 
var a = items.Skip(2).Take(5); 
MessageBox.Show("count Items in A :" + a.Count); 
+0

Mục đã tồn tại, bạn có thể kiểm tra lại câu hỏi của mình không? –

+1

@SSS: hãy đọc EDIT – Akrem

+0

IEnumerable không có thuộc tính 'Count', mặc dù nó có phương thức' Count() '. Và nếu bạn có một IEnumerable thực, lười biếng, gọi 'Count()' liệt kê toàn bộ bộ sưu tập (giả sử nó không vô hạn trong đó cast bạn có vấn đề lớn hơn), điều này phủ nhận tất cả lợi ích của việc đánh giá lười biếng. – rianjs

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