IList <T> для наблюдаемого набора <T>
У меня есть метод в приложении Silverlight, который в настоящее время возвращает IList, и я бы хотел найти самый чистый способ превратить его в ObservableCollection, чтобы:
public IList<SomeType> GetIlist()
{
//Process some stuff and return an IList<SomeType>;
}
public void ConsumeIlist()
{
//SomeCollection is defined in the class as an ObservableCollection
//Option 1
//Doesn't work - SomeCollection is NULL
SomeCollection = GetIlist() as ObservableCollection
//Option 2
//Works, but feels less clean than a variation of the above
IList<SomeType> myList = GetIlist
foreach (SomeType currentItem in myList)
{
SomeCollection.Add(currentEntry);
}
}
ObservableCollection не имеет конструктора, который будет использовать IList или IEnumerable в качестве параметра, поэтому я не могу просто создать новый. Есть ли альтернатива, которая больше похожа на вариант 1, который мне не хватает, или я просто слишком придирчив, а вариант 2 действительно разумный вариант.
Кроме того, если опция 2 является единственной реальной опцией, есть ли причина использовать IList над IEnurerable, если все, что я когда-либо собираюсь делать с ней, перебирает возвращаемое значение и добавляет его в какой-то другой вид коллекции?
Заранее спасибо
Ответы
Ответ 1
Вы можете написать быстрый и грязный метод расширения, чтобы упростить его
public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> enumerable) {
var col = new ObservableCollection<T>();
foreach ( var cur in enumerable ) {
col.Add(cur);
}
return col;
}
Теперь вы можете просто написать
return GetIlist().ToObservableCollection();
Ответ 2
Э...
ObservableCollection
имеет конструктор, который примет IEnumerable<T>
и IList<T>
происходит от IEnumerable<T>
.
Итак, вы можете "только новый"
Ответ 3
Метод расширения, который предоставил вам JaredPar, является вашим лучшим вариантом в Silverlight. Это дает вам возможность автоматически превращать любой IEnumerable в наблюдаемую коллекцию, просто ссылаясь на пространство имен и уменьшая дублирование кода. В отличие от WPF ничего не встроено, которое предлагает вариант конструктора.
И.Б..
Ответ 4
Не возобновлять поток, но конструктор ObservableCollection, который принимает IEnumerable, добавлен в silverlight 4
Ответ 5
Silverlight 4 имеет возможность просто 'new up' ObservableCollection
Здесь возможно сокращение метода расширения в Silverlight 4.
public static class CollectionUtils
{
public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> items)
{
return new ObservableCollection<T>(items);
}
}
Ответ 6
IList<string> list = new List<string>();
ObservableCollection<string> observable =
new ObservableCollection<string>(list.AsEnumerable<string>());
Ответ 7
Dim taskList As ObservableCollection(Of v2_Customer) = New ObservableCollection(Of v2_Customer)
' Dim custID As Guid = (CType(V2_CustomerDataGrid.SelectedItem, _
' v2_Customer)).Cust_UUID
' Generate some task data and add it to the task list.
For index = 1 To 14
taskList.Add(New v2_Customer() With _
{.Cust_UUID = custID, .Company_UUID, .City
})
Next
Dim taskListView As New PagedCollectionView(taskList)
Me.CustomerDataForm1.ItemsSource = taskListView