Wie konvertiere ich IEnumerable in ObservableCollection?


130

Wie konvertiere ich IEnumerablezu ObservableCollection?

Antworten:


209

Gemäß der MSDN

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

Dadurch wird eine flache Kopie der aktuellen IEnumerable erstellt und in eine ObservableCollection umgewandelt.


Ist dies schneller als die Verwendung einer ForEach-Schleife, um die Elemente einzeln in die Sammlung einzufügen?
Rexxo

4
@Rexxo es wird etwas schneller sein, es mit dem Konstruktor zu tun. Intern wird a verwendet,foreach um die Elemente in die interne Sammlung zu kopieren. Wenn Sie jedoch foreach ausführen und es aufrufen Add , wird es durchlaufen,InsertItem wodurch eine Menge zusätzlicher Dinge ausgeführt werden, die beim ersten Befüllen unnötig sind, was dazu führt, dass sie etwas langsamer sind.
Scott Chamberlain

Simples und die beste Antwort
Peterincumbria

74
  1. Wenn Sie mit nicht generischen IEnumerableProdukten arbeiten, können Sie dies folgendermaßen tun:

    public ObservableCollection<object> Convert(IEnumerable original)
    {
        return new ObservableCollection<object>(original.Cast<object>());
    }
  2. Wenn Sie mit Generika arbeiten IEnumerable<T>, können Sie dies folgendermaßen tun:

    public ObservableCollection<T> Convert<T>(IEnumerable<T> original)
    {
        return new ObservableCollection<T>(original);
    }
  3. Wenn Sie mit nicht generischen IEnumerableElementen arbeiten, aber die Art der Elemente kennen, können Sie dies folgendermaßen tun:

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

29

Um die Sache noch einfacher zu machen, können Sie daraus eine Erweiterungsmethode erstellen .

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

Dann können Sie die Methode auf jedem IEnumerable aufrufen

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

Die C # -Funktion zum Konvertieren der IEnumerable in 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;
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.