【问题标题】:C# - Convert Implict Type to ObservableCollectionC# - 将隐式类型转换为 ObservableCollection
【发布时间】:2010-03-21 01:50:18
【问题描述】:

我有一个返回隐式类型的 LINQ 语句。我需要让这种类型成为我的 Silverlight 3 应用程序中的 ObservableCollection。 Silverlight 3 中的 ObservableCollection 构造函数只提供了一个空构造函数。因此,我无法将结果直接转换为 ObservableCollection。这是我的代码:

ObservableCollection<MyTasks> visibleTasks = e.Result;
var filteredResults = from visibleTask in visibleTasks
                      select visibleTask;

filteredResults = filteredResults.Where(p => p.DueDate == DateTime.Today);
visibleTasks = filteredResults.ToList();  // This throws a compile time error

如何从隐式类型变量转到可观察集合?

谢谢

【问题讨论】:

    标签: c# linq silverlight


    【解决方案1】:

    您可以手动添加项目,如下所示:

    visibleTasks = new ObservableCollection<MyTasks>();
    foreach(var item in filteredResults)
        visibleTasks.Add(item);
    

    您可以使用以下扩展方法在一行中完成此操作:

    ///<summary>Adds zero or more items to a collection.</summary>
    public static void AddRange<TItem, TElement>(this ICollection<TElement> collection, IEnumerable<TItem> items)
        where TItem : TElement {
        if (collection == null) throw new ArgumentNullException("collection");
        if (items == null) throw new ArgumentNullException("items");
    
        foreach (var item in items)
            collection.Add(item);
    }
    

    visibleTasks = new ObservableCollection<MyTasks>();
    visibleTasks.AddRange(filteredResults);
    

    【讨论】:

      【解决方案2】:

      您可以编写一个将枚举转换为 ObservableCollection 的扩展方法,如下所示:

      public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> source)
      {
        ObservableCollection<T> obsColl = new ObservableCollection<T>();
        foreach (T element in source)
        {
          obsColl.Add( element );
        }
        return obsColl;
      }
      

      现在可以调用如下语句:

      visibleTasks = filteredResults.ToObservableCollection();
      

      【讨论】:

      • 要使其成为 IEnumerable 上的有效扩展方法,需要将方法参数定义为:public static ObservableCollection ToObservableCollection(this IEnumerable source)
      【解决方案3】:

      使用带有IEnumerable&lt;T&gt;ObservableCollection&lt;T&gt; 构造函数:

      ObservableCollection<MyTasks> visibleTasks = e.Result;
      var filteredResults = from visibleTask in visibleTasks
                            select visibleTask;
      
      filteredResults = filteredResults.Where(p => p.DueDate == DateTime.Today);
      visibleTasks = new ObservableCollection<MyTasks>(filteredResults);  // This throws a compile time error
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多