如何在Silverlight中使用LINQ创建一个ObservableCollection

3
在非Silverlight环境中,使用LINQ创建ObservableCollection很容易。这是因为ObservableCollection类有接受任何IEnumerable<T>或List<T>的构造函数。然而,Silverlight版本没有!这意味着以下代码将无法使用:
var list = (from item in e.Result
            select new ViewModel(item)).ToList();

Items = new System.Collections.ObjectModel.ObservableCollection<ViewModel>(list);

在Silverlight中无法工作。

除了使用for-each语句之外,还有其他选项可以使其工作吗?

2个回答

5

我不这么认为,但是你可以使用这个扩展方法使它更加简洁。

 public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> coll) {
        var c = new ObservableCollection<T>();
        foreach (var e in coll)
            c.Add(e);
        return c;
    }

除非有其他选择,否则这就是我要使用的方法。我只是希望有另一种更优雅的方式来完成它。 - SonOfPirate
@sonofpirate:在SL3中,这是非常好的方法,即使在SL4中,我可能仍然倾向于创建这个扩展方法(尽管在实现中使用正确的构造函数)。 - AnthonyWJones

1

如果你使用的是Silverlight 4,那么这个方法可以解决问题。 试试这个:

public static class CollectionExtensions
    {
        public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> coll)
        {
            var c = new ObservableCollection<T>();
            foreach (var e in coll)
                c.Add(e);
            return c;
        }
    }

发现于:http://forums.silverlight.net/forums/p/39487/262505.aspx


我不知道这个缺陷在SL4中已经得到解决,谢谢! - SonOfPirate
1
@sonofpirate:实际上在SL4中,您可以删除ToList,因为ObservableCollection<T>上有一个构造函数,它接受IEnumerable<T> - AnthonyWJones
太好了!我迫不及待地想要得到升级到SL4的绿灯! - SonOfPirate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接