2009-02-26 25 views
40

Tôi có hai IEnumerable<T> s.Hợp nhất hai IEnumerable <T> s

Một được bổ sung với các phần bổ sung dự phòng. Điều này sẽ luôn chứa nhiều yếu tố nhất. Cách khác sẽ được điền tùy thuộc vào một số tham số và có thể chứa ít phần tử hơn. Nếu một phần tử không tồn tại trong phần thứ hai, tôi cần điền vào phần tử tương ứng với phần tử đầu tiên.

Mã này không được công việc, nhưng cảm thấy không hiệu quả đối với tôi và yêu cầu tôi để đúc các IEnumerables để ILists hoặc sử dụng một danh sách tạm thời Người thực hiện IEquatable

IEnumerable<Person> fallBack = Repository.GetPersons(); 
IList<Person> translated = Repository.GetPersons(language).ToList(); 

foreach (Person person in fallBack) 
{ 
    if (!translated.Any(p=>p.equals(person))) 
     translated.add(person); 
} 

Bất kỳ lời đề nghị?

Trả lời

30

Hãy thử điều này.

public static IEnumerable<Person> SmartCombine(IEnumerable<Person> fallback, IEnumerable<Person> translated) { 
    return translated.Concat(fallback.Where(p => !translated.Any(x => x.id.equals(p.id))); 
} 
+4

Điều này làm việc tuyệt vời nhưng có một gotcha mà bạn phải nhận thức được: http://programmaticallyspeaking.com/how-enumerableconcat-brought-down-a-production-server.html – Oliver

49
translated.Union(fallback) 

hoặc (nếu Người không thực hiện IEquatable<Person> bởi ID)

translated.Union(fallback, PersonComparer.Instance) 

nơi PersonComparer là:

public class PersonComparer : IEqualityComparer<Person> 
{ 
    public static readonly PersonComparer Instance = new PersonComparer(); 

    // We don't need any more instances 
    private PersonComparer() {} 

    public int GetHashCode(Person p) 
    { 
     return p.id; 
    } 

    public bool Equals(Person p1, Person p2) 
    { 
     if (Object.ReferenceEquals(p1, p2)) 
     { 
      return true; 
     } 
     if (Object.ReferenceEquals(p1, null) || 
      Object.ReferenceEquals(p2, null)) 
     { 
      return false; 
     } 
     return p1.id == p2.id; 
    } 
} 
+1

Rực rỡ - Như họ nói, bạn học điều gì đó mới mỗi ngày! –

+0

Vâng, nó chưa hoàn toàn sẵn sàng ... –

+0

Điều đó sẽ chỉ làm việc mặc dù nếu lớp Person thực hiện đúng Equality. Đánh giá bởi OP Tôi đoán họ không. – JaredPar

0

sử dụng Concat. Union không hoạt động trong trường hợp List<dynamic> loại

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