C# 比较两个列表 (FileData)
C# Comparing two lists (FileData)
我正在创建一个通过文件夹结构的程序。如果有什么变化,我想把它写到一个列表中。我的问题是,在比较两个列表时,我不知道如何保存 lstChanges 中的更改。 if 语句的语法是什么?这是我现在得到的:
public static void GoThroughFileSystem(DirectoryInfo x)
{
foreach (DirectoryInfo d in x.GetDirectories())
{
//Console.WriteLine("Folder: {0}", d.Name);
GoThroughFileSystem(d);
}
foreach (FileInfo f in x.GetFiles())
{
lstNew.Add(new FileData { path = f.FullName, ChangingDate = f.LastWriteTime });
if (!lstOld.Contains(new FileData { path = f.FullName, ChangingDate = f.LastWriteTime }))
{
lstChanges.Add(new FileData { path = f.FullName, ChangingDate = f.LastWriteTime });
}
}
}
假设您的 lstOld
中有上次迭代的 List<FileInfo>
个文件,您可以将 if 语句更新为
//using System.Linq;
if (!lstOld.Any(old => old.Path == f.FullName && old.ChangingDate == f.LastWriteTime))
List<>.Contains
使用默认质量比较器。因此,创建 new FileInfo
将不起作用,除非 FileInfo
正确实现 IEquatable<T>.Equals()
。
你也可以尝试老式的左外连接:)
var lParent = x.GetFiles();
var lChild = lstOld;
var differences = lParent.GroupJoin(
lChild,
p => p.FullName,
c => c.LastWriteTime,
(p, g) => g
.Select(c => new { FullName = p.FullName, LastWriteTime = c.LastWriteTime})
.DefaultIfEmpty(new { FullName = p.FullName, LastWriteTime = null}))
.SelectMany(g => g);
如果您的目标是从两个集合中收集所有唯一值,那么您需要的东西称为完全外部联接。对于两个相同类型的集合,您可以只使用 union 并删除公共部分:
lParent.Union(lChild).Except(lParent.Intersect(lChild));
我正在创建一个通过文件夹结构的程序。如果有什么变化,我想把它写到一个列表中。我的问题是,在比较两个列表时,我不知道如何保存 lstChanges 中的更改。 if 语句的语法是什么?这是我现在得到的:
public static void GoThroughFileSystem(DirectoryInfo x)
{
foreach (DirectoryInfo d in x.GetDirectories())
{
//Console.WriteLine("Folder: {0}", d.Name);
GoThroughFileSystem(d);
}
foreach (FileInfo f in x.GetFiles())
{
lstNew.Add(new FileData { path = f.FullName, ChangingDate = f.LastWriteTime });
if (!lstOld.Contains(new FileData { path = f.FullName, ChangingDate = f.LastWriteTime }))
{
lstChanges.Add(new FileData { path = f.FullName, ChangingDate = f.LastWriteTime });
}
}
}
假设您的 lstOld
中有上次迭代的 List<FileInfo>
个文件,您可以将 if 语句更新为
//using System.Linq;
if (!lstOld.Any(old => old.Path == f.FullName && old.ChangingDate == f.LastWriteTime))
List<>.Contains
使用默认质量比较器。因此,创建 new FileInfo
将不起作用,除非 FileInfo
正确实现 IEquatable<T>.Equals()
。
你也可以尝试老式的左外连接:)
var lParent = x.GetFiles();
var lChild = lstOld;
var differences = lParent.GroupJoin(
lChild,
p => p.FullName,
c => c.LastWriteTime,
(p, g) => g
.Select(c => new { FullName = p.FullName, LastWriteTime = c.LastWriteTime})
.DefaultIfEmpty(new { FullName = p.FullName, LastWriteTime = null}))
.SelectMany(g => g);
如果您的目标是从两个集合中收集所有唯一值,那么您需要的东西称为完全外部联接。对于两个相同类型的集合,您可以只使用 union 并删除公共部分:
lParent.Union(lChild).Except(lParent.Intersect(lChild));