2009-02-26 12 views
40

मेरे पास दो IEnumerable<T> एस हैं।विलय दो आईनेमरेबल <T> एस

कोई फॉलबैक एलिमेंट्स से भरा हो जाता है। यह हमेशा सबसे अधिक तत्वों में होगा। दूसरा पैरामीटर कुछ के आधार पर भर जाएगा और संभवतः कम तत्व होंगे। यदि कोई तत्व दूसरे में मौजूद नहीं है, तो मुझे इसे पहले के समकक्ष के साथ भरना होगा।

इस कोड काम करता है, लेकिन मेरे लिए अक्षम महसूस करता है और मुझे ILists को IEnumerables कास्ट करने के लिए या एक अस्थायी सूची व्यक्ति को लागू करता है 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); 
} 

कोई सुझाव का उपयोग करने की आवश्यकता है?

उत्तर

30

इस प्रयास करें।

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

यह बहुत अच्छा काम करता है लेकिन एक गॉचा है जिसे आपको अवगत होना चाहिए: http://programmaticallyspeaking.com/how-enumerableconcat-brought-down-a-production-server.html – Oliver

49
translated.Union(fallback) 

या (यदि व्यक्ति आईडी के आधार पर IEquatable<Person> को लागू नहीं करता है)

translated.Union(fallback, PersonComparer.Instance) 

जहां PersonComparer है:

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

शानदार - जैसा कि वे कहते हैं, आप रोज़ाना कुछ नया सीखते हैं! –

+0

ठीक है, यह अभी तक तैयार नहीं है ... –

+0

यह केवल तभी काम करेगा जब व्यक्ति वर्ग समानता लागू करता है। ओपी द्वारा निर्णय मुझे लगता है कि वे नहीं करते हैं। – JaredPar

0

Concat का उपयोग करें। UnionList<dynamic> टाइप

संबंधित मुद्दे