2016-01-07 5 views
0

У меня есть ObservableCollection как following-Правильная реализация IGrouping для использования внутри longlistselector GroupHeader

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

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

Я использую это для заполнения LongListSelector с группировкой. KeyedList реализуется как this-

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.

Вскоре, вы можете использовать что-то вроде этого

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

Вы можете сделать такое преобразование проще, предоставляя метод расширения (по аналогии с BCL при условии ToArray()/ToList()), что позволит пропускать аргументы типа как этот

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();