我有一个字符串列表,列出了电影所属的类别名称。我创建了一个类定义该列表,实现List< String>和IComparable接口,以便在PivotViewerStringProperty中使用如下:
public class SLCategoryList : List<String>, IComparable
{
public int CompareTo(object obj)
{
return this[0].CompareTo((obj as SLCategoryList)[0]);
}
}
这里的重点是电影应该属于很多类别,我想要一个排序策略,这样它就可以制作数据透视视图,并按照每个类别对电影数据库进行排序。因此,当应用程序运行时,它应该同时在两个或多个类别上显示相同的电影。
我应该使用什么排序策略?
答案 0 :(得分:1)
假设我们有一些电影元数据:
class MovieMetaData
{
public string Title { get; set; }
public List<string> Categories { get; set; }
}
IEnumerable<MovieMetaData> movies = /* Some initialization. */;
我会用两种(非常相似的)方式分组我的电影:
var categories = movies.SelectMany(m => m.Categories).Distinct();
var groups = categories
.Select(c => Tuple.Create(c, movies
.Where(m => m.Categories.Contains(c))
.OrderBy(m => m.Title)));
foreach (var category in groups)
{
Console.WriteLine("Category: {0}", category.Item1);
foreach (var movie in category.Item2)
{
Console.WriteLine(movie.Title);
}
}
或者,对类别进行分组而不是使用不同的(虽然我觉得在这种情况下更加清晰 - 但请注意我最终必须区分标题):
var categories = movies.SelectMany(m => m.Categories);
var groups = categories
.Select(c => Tuple.Create(c, movies
.Where(m => m.Categories.Contains(c))
.OrderBy(m => m.Title)))
.GroupBy(g => g.Item1);
foreach (var category in groups)
{
Console.WriteLine("Category: {0}", category.Key);
foreach (var movie in category.SelectMany(c => c.Item2).Select(m => m.Title).Distinct())
{
Console.WriteLine(movie);
}
}
(注意:这里我提出了一种不同的方法。它可能不适用于您尝试做的事情,但我觉得我需要更多信息才能给出更好的答案。)