Bagaimana cara mengubah IEnumerable ke ObservableCollection?


130

Bagaimana mengkonversi IEnumerableke ObservableCollection?

Jawaban:


209

Sesuai MSDN

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

Ini akan membuat salinan dangkal dari IEnumerable saat ini dan mengubahnya menjadi ObservableCollection.


Apakah ini lebih cepat daripada menggunakan loop ForEach untuk memasukkan item satu per satu ke dalam koleksi?
Rexxo

4
@Rexxo akan sedikit lebih cepat untuk melakukannya dengan konstruktor. Secara internal ia menggunakanforeach untuk menyalin item ke koleksi internal, namun jika Anda melakukan foreach dan panggilan Add itu akan melaluiInsertItem yang melakukan banyak hal tambahan yang tidak perlu ketika awalnya mengisi menyebabkannya menjadi sedikit lebih lambat.
Scott Chamberlain

Simples dan jawaban terbaik
peterincumbria

74
  1. Jika Anda bekerja dengan non-generik IEnumerable Anda dapat melakukannya dengan cara ini:

    public ObservableCollection<object> Convert(IEnumerable original)
    {
        return new ObservableCollection<object>(original.Cast<object>());
    }
  2. Jika Anda menggunakan generik, IEnumerable<T>Anda dapat melakukannya dengan cara ini:

    public ObservableCollection<T> Convert<T>(IEnumerable<T> original)
    {
        return new ObservableCollection<T>(original);
    }
  3. Jika Anda bekerja dengan non-generik IEnumerabletetapi mengetahui jenis elemen, Anda bisa melakukannya dengan cara ini:

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

29

Untuk membuat hal-hal menjadi lebih sederhana, Anda dapat membuat metode ekstensi dari itu.

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

Kemudian Anda dapat memanggil metode pada setiap 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

C # Berfungsi untuk Mengubah IEnumerable menjadi 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;
    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.