Как сменить IEnumerable
на ObservableCollection
?Как преобразовать IEnumerable в ObservableCollection?
94
A
ответ
154
По MSDN
var myObservableCollection = new ObservableCollection<YourType>(myIEnumerable);
на это будет сделать неполную копию текущей IEnumerable и превратить его в к ObservableCollection.
57
Если вы работаете с необщего
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>()); }
24
Чтобы сделать вещи еще более просто вы можете создать Extension метод из него.
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;
}
Это быстрее, чем с помощью цикла ForEach к вставлять элементы по одному в коллекцию? – Rexxo
@Rexxo будет немного быстрее сделать это с помощью конструктора. Внутри [используется 'foreach'] (http://referencesource.microsoft.com/System/compmod/system/collections/objectmodel/observablecollection.cs.html#cfaa9abd8b214ecb), чтобы скопировать элементы во внутреннюю коллекцию, однако если вы делаете foreach и вызываете 'Add' [он будет проходить через' InsertItem'] (http://referencesource.microsoft.com/System/compmod/system/collections/objectmodel/observablecollection.cs.html#767bf62bf4a3a7c1), который делает много лишних вещей, которые необязательны при первоначальном заполнении, заставляя его немного замедляться. –