2009-02-08 29 views
19

Có cách tích hợp đơn giản để lấy danh sách có thứ tự là IEnumerable s và trả về một đơn IEnumerable có sản lượng, theo thứ tự, tất cả các phần tử trong phần tử đầu tiên, sau đó là thứ hai, v.v.Chaining IEnumerables trong C#?

Tôi chắc chắn có thể viết của riêng mình, nhưng tôi muốn biết liệu đã có một cách để thực hiện nhiệm vụ này dường như hữu ích trước khi tôi làm điều đó.

Trả lời

24

Hãy thử SelectMany.

IEnumerable<int> Collapse(IEnumerable<IEnumerable<int>> e){ 
return e.SelectMany(x => x); 
} 

Mục đích của chức năng này là để san bằng một nhóm các IEnumerable < IEnumerable <T> > vào một IEnumerable <T>. Dữ liệu trả về sẽ giữ nguyên thứ tự ban đầu.

15

Tiếp tục đến (đúng) câu trả lời JaredPar của - cũng truy vấn Cú pháp:

var all = from inner in outer 
      from item in inner 
      select item; 
12

Tiếp tục với (đúng) câu trả lời LINQ dựa trên ...

Nếu bạn không muốn sử dụng LINQ, bạn có thể phát minh ra một lớp ChainedEnumerable, sử dụng năng suất:

public class ChainedEnumerable<T> : IEnumerable<T> 
{ 
    private readonly IEnumerable<T>[] _inners; 

    public ChainedEnumerable(params IEnumerable<T>[] inners) 
    { 
     _inners = inners; 
    } 

    public IEnumerator<T> GetEnumerator() 
    { 
     foreach (IEnumerable<T> inner in _inners) 
     { 
      foreach (T t in inner) 
      { 
       yield return t; 
      } 
     } 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 

sử dụng nó như thế này:

List<string> a = new List<string> { "A1", "A2", "A3" }; 
List<string> b = new List<string> { "B1", "B2", "B3" }; 
ChainedEnumerable<string> chainedEnumerable = 
    new ChainedEnumerable<string>(a, b); 
foreach (string s in chainedEnumerable) 
    Console.WriteLine(s); 
+0

+1 Đây là một giải pháp tốt và gọn gàng. Tôi tin rằng tôi sẽ kết hợp nó vào công cụ của tôi! –