Comment convertir IEnumerable en ObservableCollection?

Comment convertir IEnumerable en ObservableCollection ?

Selon le MSDN

 var myObservableCollection = new ObservableCollection(myIEnumerable); 

Cela fera une copie superficielle de l’actuel IEnumerable et le transformera en ObservableCollection.

  1. Si vous travaillez avec IEnumerable non générique, vous pouvez le faire de la manière suivante:

     public ObservableCollection Convert(IEnumerable original) { return new ObservableCollection(original.Cast()); } 
  2. Si vous travaillez avec IEnumerable générique IEnumerable vous pouvez le faire de cette façon:

     public ObservableCollection Convert(IEnumerable original) { return new ObservableCollection(original); } 
  3. Si vous travaillez avec un IEnumerable non générique mais que vous connaissez le type d’éléments, vous pouvez le faire de cette manière:

     public ObservableCollection Convert(IEnumerable original) { return new ObservableCollection(original.Cast()); } 

Pour rendre les choses encore plus simples, vous pouvez créer une méthode d’ extension .

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

Ensuite, vous pouvez appeler la méthode sur chaque IEnumerable

 var lst = new List().ToObservableCollection(); 
 ObservableCollection distinctPkgIdList = new ObservableCollection(); guPackgIds.Distinct().ToList().ForEach(i => distinctPkgIdList.Add(i)); // distinctPkgIdList - ObservableCollection // guPackgIds.Distinct() - IEnumerable 

La fonction C # pour convertir le IEnumerable en ObservableCollection

 private ObservableCollection IEnumeratorToObservableCollection(IEnumerable source) { ObservableCollection SourceCollection = new ObservableCollection(); IEnumerator enumItem = source.GetEnumerator(); var gType = source.GetType(); ssortingng collectionFullName = gType.FullName; Type[] genericTypes = gType.GetGenericArguments(); ssortingng className = genericTypes[0].Name; ssortingng classFullName = genericTypes[0].FullName; ssortingng assName = (classFullName.Split('.'))[0]; // Get the type contained in the name ssortingng Type type = Type.GetType(classFullName, true); // create an instance of that type object instance = Activator.CreateInstance(type); List 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; }