Відповіді:
Відповідно до MSDN
var myObservableCollection = new ObservableCollection<YourType>(myIEnumerable);
Це зробить дрібну копію поточного IEnumerable і перетворить його в ObservableCollection.
foreach для копіювання предметів у внутрішню колекцію, однак, якщо ви зробите передбачення та зателефонуєте, Add він буде проходити черезInsertItem який робить багато зайвих речей, які не потрібні при спочатку заповнення, внаслідок чого це буде трохи повільніше.
Якщо ви працюєте з не загальними, IEnumerableви можете це зробити так:
public ObservableCollection<object> Convert(IEnumerable original)
{
return new ObservableCollection<object>(original.Cast<object>());
}
Якщо ви працюєте з загальними, IEnumerable<T>ви можете це зробити так:
public ObservableCollection<T> Convert<T>(IEnumerable<T> original)
{
return new ObservableCollection<T>(original);
}
Якщо ви працюєте з загальними, IEnumerableале знаєте тип елементів, ви можете це зробити так:
public ObservableCollection<T> Convert<T>(IEnumerable original)
{
return new ObservableCollection<T>(original.Cast<T>());
}
Щоб зробити речі ще простішими, ви можете створити з нього метод розширення .
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();
Функція 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;
}