2016-01-07 114 views
0

內使用我有一個像以下各項IGrouping的正確實施,longlistselector頁眉

private ObservableCollection<KeyedList<int, Anime>> _grp; 
    public ObservableCollection<KeyedList<int, Anime>> GroupedAnimeByGenre 
    { 
     get 
     { 
      return _grp; 

     } 
     set 
     { 
      _grp = value; 
      RaisePropertyChanged("GroupedAnimeByGenre"); 
     } 
    } 

我用這來填充分組一LongListSelector一個ObservableCollection。 KeyedList是這樣實現的 -

public class KeyedList<TKey, TItem> : List<TItem> 
{ 
    public TKey Key { protected set; get; } 

    public KeyedList(TKey key, IEnumerable<TItem> items) 
     : base(items) 
    { 
     Key = key; 
    } 

    public KeyedList(IGrouping<TKey, TItem> grouping) 
     : base(grouping) 
    { 
     Key = grouping.Key; 
    } 
} 

我有以下代碼來提供ObservableCollection。請記住AnimeList2是一個臨時集合。

var groupFinale = AnimeList2.GroupBy(txt => txt.id).Where(grouping => grouping.Count() > 1).ToObservableCollection(); 

GroupedAnimeByGenre = groupFinale ; 

但我無法轉換/使用groupFinale與GroupedAnimeByGenre。我缺少擴展方法部分,因爲我不太清楚語法。請幫助

回答

0

如果刪除ToObservableCollection()呼叫,並採取僅僅是部分

var groupFinale = AnimeList2.GroupBy(txt => txt.id).Where(grouping => grouping.Count() > 1); 

你會看到的groupFinale類型是IEnumerable<IGrouping<int, Anime>>。因此,應用ToObservableCollection()將導致ObservableCollection<IGrouping<int, Anime>>。然而,GroupedAnimeByGenre的類型是ObservableCollection<KeyedList<int, Anime>>。所以你需要將IEnumerable<IGrouping<int, Anime>>轉換爲IEnumerable<KeyedList<int, Anime>>這在LINQ中是由Select方法執行的。

不久,您可以通過提供(提供類似BCL ToArray()/ToList())擴展方法,將允許跳過類型參數,像這樣

使用這樣的

var groupFinale = AnimeList2 
    .GroupBy(txt => txt.id) 
    .Where(grouping => grouping.Count() > 1) 
    .Select(grouping => new KeyedList<int, Anime>(grouping)) 
    .ToObservableCollection(); 

你能做出這樣的轉換更容易

public static class KeyedList 
{ 
    public static KeyedList<TKey, TItem> ToKeyedList<TKey, TItem>(this IGrouping<TKey, TItem> source) 
    { 
     return new KeyedList<TKey, TItem>(source); 
    } 
} 

然後你可以使用簡單的

var groupFinale = AnimeList2 
    .GroupBy(txt => txt.id) 
    .Where(grouping => grouping.Count() > 1) 
    .Select(grouping => grouping.ToKeyedList()) 
    .ToObservableCollection();