我正在比较两个文件(旧文件和新文件)中的数据。这些文件类似,除了新文件具有旧文件中已更改的项目之外。我需要将已更改的项目添加到已更改的列表,并将未更改的项目添加到未更改的列表。为此,我从旧文件中的新文件中搜索每个项目,然后比较文件元素。如果找到了新项目,则将其添加到未更改的列表中,否则将其添加到已更改的列表中。
我现在要确定的是新文件中的哪一项已更改。如果找不到该物品,我该如何确定?另外,新文件中的多个元素可能与旧文件不同。
在此处摘录:
foreach (var newfileItem in NewFile)
{
var checkitem = OldFile.FirstOrDefault(d => d.fileID == newfileItem.fileID && d.SysName == newfileItem.Sysname && d.SysCount == newfileItem.SysCount);
if (checkitem == null) //item not found therefore something changed
{
//which item changed??
changedlist.Add(checkitem);
}
else //item found, therefore unchanged
{
unchangedlist.Add(newfileItem);
}
checkitem = null;
}
答案 0 :(得分:0)
即使您使用“文件”一词,在我看来,您也已经完成了读取文件内容的部分。而且我相信NewFile
和OldFile
是表示文件行内容的某些类实例的列表。
所以我将其命名为FileItem
,并且看起来像这样。
public class FileItem
{
public int FileID { get; set; }
public int SysCount { get; set; }
public string SysName { get; set; }
}
我想您本质上是想找出哪些是OldFile
所独有的项目,哪些是NewFile
所独有的项目(也许也是两者的共同点)。
为此,我首先要写一个EqualityComparer
,以便可以比较两个列表中的项目。从您的代码看来,如果该类的三个属性相等,则您认为两项相等。因此,我遵循了这种逻辑。
public class FileComparer : IEqualityComparer<FileItem>
{
public bool Equals(FileItem x, FileItem y)
{
return (x.FileID == y.FileID && x.SysCount == y.SysCount && x.SysName == y.SysName);
}
public int GetHashCode(FileItem obj)
{
unchecked
{
int hash = 17;
if (obj != null)
{
hash = hash * 23 + obj.FileID.GetHashCode();
hash = hash * 23 + obj.SysCount.GetHashCode();
hash = hash * 23 + obj.SysName.GetHashCode();
}
return 0;
}
}
}
现在就像使用LINQ
方法Except()
和Intersect()
来获得所需的内容一样简单。
static void Main(string[] args)
{
List<FileItem> OldFile = new List<FileItem>
{
new FileItem() { FileID = 1, SysCount = 100, SysName = "One" },
new FileItem() { FileID = 2, SysCount = 200, SysName = "Two" },
new FileItem() { FileID = 3, SysCount = 300, SysName = "Three" },
new FileItem() { FileID = 4, SysCount = 400, SysName = "Four" },
new FileItem() { FileID = 5, SysCount = 500, SysName = "Five" }
};
List<FileItem> NewFile = new List<FileItem>
{
new FileItem() { FileID = 1, SysCount = 100, SysName = "One" },
new FileItem() { FileID = 200, SysCount = 200, SysName = "Two" },
new FileItem() { FileID = 3, SysCount = 300, SysName = "Three" },
new FileItem() { FileID = 400, SysCount = 400, SysName = "Four" },
new FileItem() { FileID = 5, SysCount = 500, SysName = "Five" }
};
var onlyInNew = NewFile.Except(OldFile, new FileComparer());
var onlyInOld = OldFile.Except(NewFile, new FileComparer());
var commonToBoth = OldFile.Intersect(NewFile, new FileComparer());
Console.ReadLine();
}