2013-09-26 157 views
5

Tôi đang cố gắng thực hiện các nhóm được đánh số của một danh sách. Ví dụ truy vấn LINQ này cung cấp cho những gì tôi muốnSử dụng chỉ mục trong SelectMany LINQ

(from word in "The quick brown fox jumps over the lazy dog" .Split() 
group word by word.Length into w 
select w) 
.Select((value, index) => new { i = index + 1, value }) 
.SelectMany(
sm => sm.value, 
(sm, s) => new { sm.i, s}) 

1 The 
1 fox 
1 the 
1 dog 
2 quick 
2 brown 
2 jumps 
3 over 
3 lazy 

Nhưng tôi đã quyết định để tối ưu hóa truy vấn này: Tại sao chúng ta cần sử dụng bên ngoài để chỉ số SelectMany nếu nó đã sở hữu chỉ số trong tình trạng quá tải thứ 4 của SelectMany? Và tôi đã cố gắng sử dụng tình trạng quá tải này theo cách tiếp theo, nhưng tôi không thấy giải pháp.

(from word in "The quick brown fox jumps over the lazy dog".Split() 
      group word by word.Length into w 
      select w) 
       .SelectMany(
       (source, index) => ??????, 
       (msource, coll) => ??????) 

Trả lời

3

This overload của SelectMany nên làm việc:

(from word in "The quick brown fox jumps over the lazy dog".Split() 
group word by word.Length into g 
select g) 
.SelectMany((g, i) => g.Select(word => new { index = i + 1, word })) 
+0

Tuyệt vời! Nó dễ dàng hơn nhiều so với tôi mong đợi. –