2009-09-23 74 views
53

它是LINQ結果的事實可能與該問題無關,但無論如何我都會提及 - 因爲這是導致此問題的上下文。將LINQ結果轉換爲ObservableCollection

我運行一個LINQ查詢。結果是一個;

IEnumerable<MyClass> 

我想把結果放到一個ObservableCollection中;

ObservableCollection<MyClass> 

我該如何操作? (無需運行IEnumerable並將元素複製到ObservableCollection)。我注意到LINQ已經有了幾個To ..()函數,但它似乎並沒有幫助我完成這個演員..?

回答

91

只需使用:

ObservableCollection<Foo> x = new ObservableCollection<Foo>(enumerable); 

這將做必要的複製。沒有辦法觀察對實時查詢的更改 - 儘管ObservableQuery<T>的想法是一個有趣的(雖然很具有挑戰性)。

如果你想擴展方法來做到這一點,這很簡單:

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

任何人現在如何在Silverlight 3.0中實現此目標,其中只有默認的新ObservableCollection ()構造函數可用? – 2009-12-02 10:43:38

+0

不幸的是,如果您想將結果複製到已經由ReadOnlyObservableCollection包裝的ObservableCollection中,因爲ReadOnlyObservableCollection無法被重新綁定到新的集合,所以沒有什麼用處。在這種情況下,你似乎堅持使用foreach循環並一次拷貝一個元素。 – Neutrino 2014-01-21 17:12:28

+0

@Neutrino:我認爲那是一個與當時問題中提出的問題不同的問題。這是一個有效的問題,我只是不認爲它是OP所擁有的。 – 2014-01-21 17:15:47

10

您可以使用ObservableCollectionconstructor此:

ObservableCollection<MyClass> obsCol = 
     new ObservableCollection<MyClass>(myIEnumerable); 
13
var linqResults = foos.Where(f => f.Name == "Widget"); 

var observable = new ObservableCollection<Foo>(linqResults); 
0

IEnumerable的僅僅是接口。

您需要將IEnumerable中的內容複製到ObservableCollection中。您可以通過將IEnumerable傳遞給ObersvableCollection的構造函數來創建新文件。

0

我幾年前編寫了這個庫。

https://github.com/wasabii/OLinq

它不會做的正是你可能想要的東西,但它更多。它是一個Linq查詢提供程序,用於解析表達式樹,附加到引用的集合,並公開另一個集合,該集合在發生更改時發出事件。

它缺少一些Linq運營商。但是代碼庫不難擴展。

+0

我也一直在爲它維護NuGet包。 HTTPS://www.nuget。org/packages/OLinq/ – wasabi 2015-03-01 18:00:56

+0

我想使用你的軟件包,但自述文件中提供的例子不起作用,在'Where'之後對'ToObservableView'的調用是未知的 – 2016-04-18 12:53:00

+1

對README的不確定。看起來有人在過去把它弄糟了。 。返回一個IQueryable。但實際的對象是一個ObservableQuery。我有一個.AsObservableQuery()方法來執行強制轉換。 ().AsObservableQuery()。ToObservableView() 與.AsEnumerable和AsParallelQuery以及所有其他類型不同。 – wasabi 2016-04-19 17:02:21