我正在构建一个 WPF 应用程序来监视用户计算机上的目录。该应用程序从受监控的目录上传文件,然后将一些信息保存到 SQLite 数据库中。部分业务处理是对已经上传的文件不重新处理,对已经上传但自上次上传后发生变化的文件重新上传。
我有两个构建并返回一个辅助方法List<FileMetaData>
我用过的LINQ - 完全外连接 https://stackoverflow.com/questions/5489987/linq-full-outer-join加入.我的问题是,当我使用我的代码时,代码似乎不起作用FileMetaData
目的。似乎一切都应该有效,但我不知道为什么它不起作用。我通常会尝试在其他线程上发表评论,但目前我没有“代表”来执行此操作。
下面是我构建的一个示例,如果您运行它,它会显示我的问题LINQpad http://www.linqpad.net/。在单击运行按钮之前,请确保将语言设置为“C# 程序”。我应该采取什么不同的措施才能使样本与对象一起工作?万分感谢!
void Main()
{
var dbItems = new List<FileMetaData>() {
new FileMetaData {FilePath = "C:\\Foo.txt", DbTimestamp = "1" },
new FileMetaData {FilePath = "C:\\FooBar.txt", DbTimestamp = "3" },
};
var fsItems = new List<FileMetaData>() {
new FileMetaData {FilePath = "C:\\Bar.txt", FsTimestamp = "2" },
new FileMetaData {FilePath = "C:\\FooBar.txt", FsTimestamp = "3" },
};
var leftOuter = from d in dbItems
join f in fsItems on d.FilePath equals f.FilePath
into temp
from o in temp.DefaultIfEmpty(new FileMetaData(){})
select new FileMetaData {
FilePath = d.FilePath,
DbTimestamp = d.DbTimestamp,
FsTimestamp = o.FsTimestamp,
};
var rightOuter = from f in fsItems
join d in dbItems on f.FilePath equals d.FilePath
into temp
from o in temp.DefaultIfEmpty(new FileMetaData(){})
select new FileMetaData {
FilePath = f.FilePath,
DbTimestamp = o.DbTimestamp,
FsTimestamp = f.FsTimestamp,
};
var full = leftOuter.AsEnumerable().Union(rightOuter.AsEnumerable());
leftOuter.Dump("Left Results");
rightOuter.Dump("Right Results");
full.Dump("Full Results");
}
// Define other methods and classes here
public class FileMetaData
{
public string FilePath;
public string DbTimestamp;
public string FsTimestamp;
}
EDIT:
下面的答案正是我正在寻找的。我实施了IEqualityComparer
如下定义并将我的电话更改为var full = leftOuter.Union(rightOuter, new FileMetaDataCompare())
...
public class FileMetaDataCompare : IEqualityComparer<FileMetaData>
{
public bool Equals(FileMetaData x, FileMetaData y)
{
var areEqual = x.FilePath == y.FilePath;
areEqual = areEqual && x.DbTimestamp == y.DbTimestamp;
areEqual = areEqual && x.FsTimestamp == y.FsTimestamp;
return areEqual;
}
public int GetHashCode(FileMetaData obj)
{
var hCode = string.Concat(obj.FilePath, obj.DbTimestamp, obj.FsTimestamp);
return hCode.GetHashCode();
}
}