2014-11-21 16 views
9

Tôi đang cố gắng triển khai Phương thức tạo nhiều danh sách, ví dụ:Kết hợp nhiều IEnumerable <T>

List<string> L1 = new List<string>{"1","2"}; 
List<string> L2 = new List<string>{"1","2"}; 
List<string> L3 = new List<string>{"1","2"}; 
var result = Concartenate(L1,L2,L3); 

nhưng Phương pháp của tôi không hoạt động:

public static IEnumerable<T> Concartenate<T>(params IEnumerable<T> List) 
{ 
    var Temp = List.First(); 
    for (int i = 1; i < List.Count(); i++) 
    { 
     Temp = Enumerable.Concat(Temp, List.ElementAt(i)); 
    } 
    return Temp; 
} 
+3

Calling IEnumerable.Count() mỗi chu kỳ là một chút của một sự lãng phí. Gọi nó một lần và lưu trữ nó trong một biến, hoặc tốt hơn, sử dụng một vòng lặp foreach: 'var Temp = List.First(); foreach (IEnumerable chuỗi trong List.Skip (1)) Temp = Enumerable.Concat (chuỗi); –

Trả lời

44

Sử dụng SelectMany:

public static IEnumerable<T> Concatenate<T>(params IEnumerable<T>[] lists) 
{ 
    return lists.SelectMany(x => x); 
} 
4

Nếu bạn muốn làm cho công việc chức năng của bạn, bạn cần một mảng của IEnumerable:

public static IEnumerable<T> Concartenate<T>(params IEnumerable<T>[] List) 
{ 
    var Temp = List.First(); 
    for (int i = 1; i < List.Count(); i++) 
    { 
     Temp = Enumerable.Concat(Temp, List.ElementAt(i)); 
    } 
    return Temp; 
} 
+1

Tham số 'Danh sách' là một mảng của IEnumerables và nó có thể không chứa các mục. Điều này sẽ gây ra 'List.First()' để ném một ngoại lệ. Trước tiên bạn nên kiểm tra độ dài của mảng này. Tôi cũng sẽ sử dụng thuộc tính 'Length' và indexer' List [] 'thay vì các phần mở rộng LINQ tương đương trong vòng lặp for. –

+0

Không sử dụng tên lớp chung làm tên biến. = ( – jpmc26

0

Tất cả những gì bạn phải làm là thay đổi:

public static IEnumerable<T> Concartenate<T>(params IEnumerable<T> List) 

để

public static IEnumerable<T> Concartenate<T>(params <IEnumerable<T>[] List) 

Lưu ý thêm [].

1

Chỉ cần cho đầy đủ tôi thấy cách tiếp cận khác:

public static IEnumerable<T> Concatenate<T>(params IEnumerable<T>[] List) 
{ 
    foreach (IEnumerable<T> element in List) 
    { 
     foreach (T subelement in element) 
     { 
      yield return subelement; 
     } 
    } 
} 
Các vấn đề liên quan