Як перетворити IEnumerable в ObservableCollection?


Відповіді:


209

Відповідно до MSDN

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

Це зробить дрібну копію поточного IEnumerable і перетворить його в ObservableCollection.


Це швидше, ніж використовувати цикл ForEach для вставки елементів по одному в колекцію?
Rexxo

4
@Rexxo це буде трохи швидше зробити це з конструктором. Внутрішнє використання використовуєтьсяforeach для копіювання предметів у внутрішню колекцію, однак, якщо ви зробите передбачення та зателефонуєте, Add він буде проходити черезInsertItem який робить багато зайвих речей, які не потрібні при спочатку заповнення, внаслідок чого це буде трохи повільніше.
Скотт Чемберлен

Симплекс та найкраща відповідь
peterincumbria

74
  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>());
    }
    

29

Щоб зробити речі ще простішими, ви можете створити з нього метод розширення .

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

Тоді ви можете викликати метод на кожному 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 # для перетворення IEnumerable в 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;
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.