Antworten:
Gemäß der MSDN
var myObservableCollection = new ObservableCollection<YourType>(myIEnumerable);
Dadurch wird eine flache Kopie der aktuellen IEnumerable erstellt und in eine ObservableCollection umgewandelt.
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.
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>());
}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);
}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>());
}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();
ObservableCollection<decimal> distinctPkgIdList = new ObservableCollection<decimal>();
guPackgIds.Distinct().ToList().ForEach(i => distinctPkgIdList.Add(i));
// distinctPkgIdList - ObservableCollection
// guPackgIds.Distinct() - IEnumerable
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;
}