Linq过滤了一个属性的getter

时间:2013-06-19 02:31:18

标签: c# linq error-handling implicit-conversion

是否可以在属性中过滤ObservableCollection?我尝试了以下各种变体:

public ObservableCollection<Worker> Workers
{
    get { return DataManager.Data.MasterWorkerList.Where(w => w.Known == true); }
    set { DataManager.Data.MasterWorkerList = value; }
}

我收到错误消息:

  

无法隐式转换类型   'System.Collections.Generic.IEnumerable'到   'System.Collections.ObjectModel.ObservableCollection'。   存在显式转换(您是否错过了演员?)

当我转换类型时,程序会编译,但我得到一个InvalidCastException

  

无法投射类型的对象   'WhereEnumerableIterator 1[AoW.Models.Worker]' to type 'System.Collections.ObjectModel.ObservableCollection 1 [AoW.Models.Worker]'

有可能以这种方式过滤吗?如果是这样,我错过了什么?

1 个答案:

答案 0 :(得分:3)

您需要将IEnumerable<Worker>转换为ObservableCollection<Worker>。您可以通过将IEnumerable传递到ObservableCollection的构造函数中来创建新文件,如下所示:

 return  new ObservableCollection<Worker>(DataManager.Data.MasterWorkerList.Where(w => w.Known == true));

通过定义扩展方法,您可以使代码更具可读性。这可以这样做:

public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> source)
{
   if (source == null)
   {
       throw new ArgumentNullException("source");
   }
   return new ObservableCollection<T>(source);
}

因此,您的代码将变得非常简单和可读

public ObservableCollection<Worker> Workers
{
    get 
    { 
       var workerList = DataManager.Data.MasterWorkerList.Where(w => w.Known == true);
       return workerList.ToObservableCollection<Worker>();
    }
    set 
    { 
       DataManager.Data.MasterWorkerList = value;
    }
}