我计划创建一个应用程序来排序和查看我拥有的照片和图像。
我希望为程序提供一个文件夹列表(包含子文件夹),以便在我浏览时使用多个自定义标记处理和标记图像。如果我在搜索栏中输入一个或多个标签,我希望所有带有该标签的图像都显示在面板中。
转向方法是SQL,但我不希望在后台运行SQL服务器。我希望程序完全可移植,所以只需要exe文件,也可以创建少量文件。
我以为我会创建一个树,其中每个节点都是一个文件夹,而叶子是图像。然后,我会将叶子的标记添加到父节点并向上级联,以便根节点具有所有标记的列表。这应该允许快速搜索和并行化以快速构建树。
但是在我开始研究这样一棵树之前,我想知道是否已有类似的东西,或者是否有更好的方法?
为了说清楚,我在这里谈论多个标签,所以字典不会起作用。
答案 0 :(得分:0)
按定义标记是唯一的,因此需要进行索引和排序。
A Dictionary<Tag,ImageCollection>
。为什么不?似乎是标签的理想选择。
A Dictionary<Image, TagCollection>
。以上的反向参考。你不想尝试通过字典值来获取密钥。
创建自定义类。 Tag
,Image
,TagCollection
,ImageCollection
;然后覆盖Equals
,GetHashCode
,实施IComparable
。这将优化内置的.net索引,排序和搜索。许多集合“查找”方法需要代表进行自定义搜索。请务必阅读MSDN文档。
我认为这可能构成核心结构。对于任何给定的查询,使用这些结构的初始提取进行凝视应该非常快。而且产生定制系列也会有所帮助。
混合LINQ和“传统”编码没有任何问题。我希望无论如何你最好使用索引/排序标签。
答案 1 :(得分:0)
以下是我如何处理它。
首先,使用SQLite。它是一个单dll分发,轻量级,超高速和令人印象深刻的数据库,其唯一目的是由这些类型的应用程序使用。数据库是一种比将树木持久保存到文件更好的方法(自定义持久性的问题并不是说这个想法本身就是坏的,而是在那里,而不是那里有十几个边缘情况它会不会出现这种情况。需要处理你不太可能想到数据库自动覆盖它们的位置。)
其次,为您的媒体和标签设置一些POCO。像这样:
abstract class Media
{
public string Filename {get;set;}
public virtual ICollection<Tag> Tags {get;set;}
}
public class Image : Media
{
public ImageFormat Format {get;set;}
public int ResX {get;set;}
public int ResY {get;set;} // or whatever
}
public class Video : Media
{
public VideoFormat Format {get;set;}
public int Bitrate {get;set;}
}
public class Tag
{
public string Name {get;set;}
public virtual ICollection<Media> Media {get;set;}
}
这构成了所有MVVM的基础(你使用MVF和WPF,对吧?)
使用Entity Framework进行数据访问(持久性和查询)。
有了这个,您可以执行以下操作来查询您的项目:
public IEnumerable<Media> SearchByTags(List<Tag> tags) {
var q = from m in _context.Media
join mt in _context.MediaTags on m.ID = mt.ID
join t in tags on mt.Name = tag.Name
select m;
return q;
}
这将转换为相对优化的数据库查询,并根据您要搜索的标记为您提供适用媒体列表。将此列表反馈到您的演示文稿(MVVM)层,并根据结果构建您的树。
(这假设您有一个媒体表,一个标签表和一个MediaTags的交叉/桥接表 - 我已经留下了许多细节,这是非常多的空气码,但作为一般概念,我觉得它很好用。)