IList <t>到ObservableCollection <t> </t> </t>

时间:2009-04-08 20:13:30

标签: c# silverlight

我在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是唯一真正的选项,是否有理由在IEnurerable上使用IList,如果我真正要做的就是迭代返回值并将其添加到其他类型收集?

提前致谢

8 个答案:

答案 0 :(得分:29)

你可以写一个快速而又脏的扩展方法来轻松实现

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();

答案 1 :(得分:21)

呃......

ObservableCollection 确实有一个constructorIEnumerable<T>IList<T>来自IEnumerable<T>

所以你可以“只是新人”

答案 2 :(得分:2)

JaredPar为您提供的扩展方法是Silverlight中的最佳选择。它使您能够通过引用命名空间自动将任何IEnumerable转换为可观察集合,并减少代码重复。没有内置的东西,不像WPF,它提供了构造函数选项。

IB。

答案 3 :(得分:2)

不重新打开线程,但是带有IEnumerable的ObservableCollection构造函数已添加到silverlight 4

答案 4 :(得分:2)

Silverlight 4 DOES只能'new up' an ObservableCollection

这是Silverlight 4中缩短的扩展方法。

public static class CollectionUtils
{
    public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> items)
    {
        return new ObservableCollection<T>(items);
    }
}

答案 5 :(得分:1)

        IList<string> list = new List<string>();

        ObservableCollection<string> observable = 
            new ObservableCollection<string>(list.AsEnumerable<string>());

答案 6 :(得分:1)

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

答案 7 :(得分:0)

您可以这样做:

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);
     }
}