要在 longlistselector groupheader 中使用的 IGrouping 的正确实现
Correct implementation of IGrouping to be used inside longlistselector groupheader
我有一个如下所示的 ObservableCollection-
private ObservableCollection<KeyedList<int, Anime>> _grp;
public ObservableCollection<KeyedList<int, Anime>> GroupedAnimeByGenre
{
get
{
return _grp;
}
set
{
_grp = value;
RaisePropertyChanged("GroupedAnimeByGenre");
}
}
我正在使用它来填充带有分组的 LongListSelector。 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 ;
但我无法convert/use groupFinale with GroupedAnimeByGenre。我缺少扩展方法部分,因为我不太了解语法。请帮忙
如果您删除 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();
我有一个如下所示的 ObservableCollection-
private ObservableCollection<KeyedList<int, Anime>> _grp;
public ObservableCollection<KeyedList<int, Anime>> GroupedAnimeByGenre
{
get
{
return _grp;
}
set
{
_grp = value;
RaisePropertyChanged("GroupedAnimeByGenre");
}
}
我正在使用它来填充带有分组的 LongListSelector。 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 ;
但我无法convert/use groupFinale with GroupedAnimeByGenre。我缺少扩展方法部分,因为我不太了解语法。请帮忙
如果您删除 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();