C# IList<;T>;可观察收集<;T>;
我在Silverlight应用程序中有一个方法,当前返回一个IList,我想找到最干净的方法将其转化为一个可观察的集合,因此:C# IList<;T>;可观察收集<;T>;,c#,silverlight,C#,Silverlight,我在Silverlight应用程序中有一个方法,当前返回一个IList,我想找到最干净的方法将其转化为一个可观察的集合,因此: public IList<SomeType> GetIlist() { //Process some stuff and return an IList<SomeType>; } public void ConsumeIlist() { //SomeCollection is defined in the class as an O
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);
}
}
公共IList GetIlist()
{
//处理一些东西并返回IList;
}
公共无效消费者()
{
//SomeCollection在类中定义为ObservableCollection
//选择1
//不起作用-SomeCollection为NULL
SomeCollection=GetIlist()作为ObservableCollection
//选择2
//工作,但感觉不如上述的变化清洁
IList myList=GetIlist
foreach(myList中的SomeType currentItem)
{
添加(currentEntry);
}
}
ObservableCollection没有将IList或IEnumerable作为参数的构造函数,因此我无法简化新的构造函数。是否有一个更像我遗漏的选项1的替代方案,或者我只是太挑剔了,而选项2真的是一个合理的选择
另外,如果选项2是唯一的实物选项,那么如果我真正要做的就是迭代返回值并将其添加到其他类型的集合中,那么是否有理由对IEnurerable使用IList
提前感谢您可以编写一个快速而肮脏的扩展方法,使其变得简单
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;
}
呃
是否有一个将取an的,并派生自IEnumerable
因此,您可以“只创建一个新列表”IList list=new list();
可观测收集可观测=
新的ObservableCollection(list.AsEnumerable());
JaredPar为您提供的扩展方法是您在Silverlight中的最佳选择。它使您能够通过引用名称空间自动将任何IEnumerable转换为可观察集合,并减少代码重复。与WPF不同,WPF没有内置任何东西,WPF提供构造函数选项
ib.不重新打开线程,但silverlight 4中添加了一个用于ObservableCollection的构造函数 下面是Silverlight 4中可能的缩短扩展方法
public static class CollectionUtils
{
public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> items)
{
return new ObservableCollection<T>(items);
}
}
公共静态类集合utils
{
公共静态ObservableCollection ToObservableCollection(此IEnumerable items)
{
返回新的ObservableCollection(项目);
}
}
您可以执行以下操作:
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);
}
}
公共类SomeTypeCollection:ObservableCollection
{
公共SomeTypeCollection():base(){}
公共SomeTypeCollection(IEnumerable IEObj):基(IEObj){
}
}
公共消费主义者
{
公共SomeTypeCollection OSomeTypeCllt{get;set;}
MyDbContext _dbCntx=新的MyDbContext();
公共消费者(){
OSomeTypeCllt=new
SomeTypeCollection(_dbCntx.ComeTypeSQLTable);
}
}
我已经考虑过这一点,也许应该这么说。大多数情况下,我想确认我没有遗漏任何东西。@Steve不幸的是,我不认为你忽略了任何东西。当你向列表中添加一个新项目时,这不会带来问题。因为您创建了一个新的ObservableCollection,所以它将失去对该项目的跟踪。@azamsharp:确实如此。1) To*方法始终复制其输入2)由于源不提供INotifyCollectionChanged,因此无法检测对原始的更改。Silverlight 4现在有一个“新建”ObservableCollection的构造函数,因此您可以这样做,而不是自己枚举。文档似乎不正确。我已经用reflector.exe验证了这一点。这可能是ObservableCollection的WPF版本吗?我在Silverlight工作。编辑以将其包含在文本中,而不仅仅是标记中。@JaredPar:你是说你使用reflector来验证Silverlight版本是否有IEnumerable构造函数?@Steve Brouillard:我完全错过了Silverlight标记。我的错。我找到了文档,其中不包括IEnumerable构造函数。文档的Silverlight版本只包含默认构造函数:Silverlight版本的ObservableCollection只包含默认构造函数。无法新建一个并传递任何内容来初始化它。silverlight 4的更新:ObservableCollection现在有一个构造函数,该构造函数将IList或IEnumerable作为参数
public static class CollectionUtils
{
public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> items)
{
return new ObservableCollection<T>(items);
}
}
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
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);
}
}