IList <T>в коллекцию ObservableCollection <T> - PullRequest
16 голосов
/ 09 апреля 2009

У меня есть метод в приложении 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, если все, что я когда-либо действительно собираюсь делать с ним, это итерация возвращаемого значения и добавление его в какой-либо другой вид коллекции?

Заранее спасибо

Ответы [ 8 ]

30 голосов
/ 09 апреля 2009

Вы можете написать быстрый и грязный метод расширения, чтобы упростить его

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();
21 голосов
/ 09 апреля 2009

Er ...

ObservableCollection имеет конструктор , который принимает IEnumerable<T> и IList<T> происходит от IEnumerable<T>.

Так что вы можете "просто новый"

2 голосов
/ 01 ноября 2010

Silverlight 4 ДОЛЖЕН просто «обновить» коллекцию ObservableCollection

Вот сокращенный метод расширения, возможный в Silverlight 4.

public static class CollectionUtils
{
    public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> items)
    {
        return new ObservableCollection<T>(items);
    }
}
2 голосов
/ 08 октября 2010

Не для повторного открытия потока, но для Silverlight 4

добавлен конструктор для ObservableCollection, который принимает IEnumerable
2 голосов
/ 09 апреля 2009

Метод расширения, который вам дал JaredPar, - ваш лучший вариант в Silverlight. Это дает вам возможность автоматически превращать любой IEnumerable в наблюдаемую коллекцию, просто ссылаясь на пространство имен, и уменьшает дублирование кода. Там нет ничего встроенного, в отличие от WPF, который предлагает опцию конструктора.

И.Б..

1 голос
/ 14 августа 2011
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
1 голос
/ 09 апреля 2009
        IList<string> list = new List<string>();

        ObservableCollection<string> observable = 
            new ObservableCollection<string>(list.AsEnumerable<string>());
0 голосов
/ 05 марта 2019

Вы можете сделать это:

public class SomeTypeCollection: ObservableCollection<SomeType>
{
    public SomeTypeCollection() : base() { }
    public SomeTypeCollection(IEnumerable<SomeType> IEObj) : base(IEObj) { 
 }
}

public ConsumeIlist
{
    public SomeTypeCollection OSomeTypeCllt { get; set; }
    MyDbContext _dbCntx = new MyDbContext();
     public ConsumeIlist(){
          OSomeTypeCllt = new 
   SomeTypeCollection(_dbCntx.ComeTypeSQLTable);
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...