2010-08-24 16 views

उत्तर

154

MSDN

var myObservableCollection = new ObservableCollection<YourType>(myIEnumerable); 

इस के अनुसार वर्तमान IEnumerable की एक उथले प्रतिलिपि बनाने और एक ObservableCollection करने के लिए यह हो जाएगा।

+0

करने के लिए एक foreach पाश का उपयोग करने से यह जल्दी है वस्तुओं को संग्रह में एक-एक करके सम्मिलित करें? – Rexxo

+2

@Rexxo यह कन्स्ट्रक्टर के साथ ऐसा करने के लिए थोड़ा तेज़ होगा। आंतरिक संग्रह में आइटम कॉपी करने के लिए आंतरिक रूप से [यह 'foreach'] का उपयोग कर रहा है (http://referencesource.microsoft.com/System/compmod/system/collections/objectmodel/observablecollection.cs.html#cfaa9abd8b214ecb) आप foreach करते हैं और 'जोड़ें' कहते हैं [यह 'InsertItem'] के माध्यम से जा रहा है (http://referencesource.microsoft.com/System/compmod/system/collections/objectmodel/observablecollection.cs.html#767bf62bf4a3a7c1) जो करता है बहुत सी अतिरिक्त चीजें जो अनजाने में होती हैं जब शुरुआत में इसे थोड़ा धीमा कर दिया जाता है। –

57
  1. आप गैर सामान्य IEnumerable साथ काम कर रहे हैं आप इसे इस तरह से कर सकते हैं:

    :

    public ObservableCollection<object> Convert(IEnumerable original) 
    { 
        return new ObservableCollection<object>(original.Cast<object>()); 
    } 
    
  2. आप सामान्य IEnumerable<T> साथ काम कर रहे हैं आप इसे इस तरह से कर सकते हैं

    public ObservableCollection<T> Convert<T>(IEnumerable<T> original) 
    { 
        return new ObservableCollection<T>(original); 
    } 
    
  3. यदि आप गैर-जेनेरिक IEnumerable के साथ काम कर रहे हैं लेकिन तत्वों के प्रकार को जानते हैं, तो आप इसे इस तरह से कर सकते हैं:

    public ObservableCollection<T> Convert<T>(IEnumerable original) 
    { 
        return new ObservableCollection<T>(original.Cast<T>()); 
    } 
    
24

चीजों को और भी अधिक आसान बनाने के लिए आप इसे से बाहर एक Extension विधि बना सकते हैं।

public static class Extensions 
{ 
    public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> col) 
    { 
     return new ObservableCollection<T>(col); 
    } 
} 

तो फिर तुम IEnumerable कन्वर्ट करने के लिए हर IEnumerable

var lst = new List<object>().ToObservableCollection(); 
3
ObservableCollection<decimal> distinctPkgIdList = new ObservableCollection<decimal>(); 
guPackgIds.Distinct().ToList().ForEach(i => distinctPkgIdList.Add(i)); 

// distinctPkgIdList - ObservableCollection 
// guPackgIds.Distinct() - IEnumerable 
1

सी # समारोह पर विधि कॉल कर सकते हैं ObservableCollection करने के लिए

private ObservableCollection<dynamic> IEnumeratorToObservableCollection(IEnumerable source) 
    { 

     ObservableCollection<dynamic> SourceCollection = new ObservableCollection<dynamic>(); 

     IEnumerator enumItem = source.GetEnumerator(); 
     var gType = source.GetType(); 
     string collectionFullName = gType.FullName; 
     Type[] genericTypes = gType.GetGenericArguments(); 
     string className = genericTypes[0].Name; 
     string classFullName = genericTypes[0].FullName; 
     string assName = (classFullName.Split('.'))[0]; 

     // Get the type contained in the name string 
     Type type = Type.GetType(classFullName, true); 

     // create an instance of that type 
     object instance = Activator.CreateInstance(type); 
     List<PropertyInfo> oProperty = instance.GetType().GetProperties().ToList(); 
     while (enumItem.MoveNext()) 
     { 

      Object instanceInner = Activator.CreateInstance(type); 
      var x = enumItem.Current; 

      foreach (var item in oProperty) 
      { 
       if (x.GetType().GetProperty(item.Name) != null) 
       { 
        var propertyValue = x.GetType().GetProperty(item.Name).GetValue(x, null); 
        if (propertyValue != null) 
        { 
         PropertyInfo prop = type.GetProperty(item.Name); 
         prop.SetValue(instanceInner, propertyValue, null); 
        } 
       } 
      } 

      SourceCollection.Add(instanceInner); 
     } 

     return SourceCollection; 
    } 
संबंधित मुद्दे