如何在c#中合并和更新列表的节点
本文关键字:更新 列表 节点 合并 | 更新日期: 2023-09-27 18:10:27
我知道SO上有很多关于这个话题的一般性问题。我试了很多次,但都没有成功。下面是合并
的代码var existingFileDetails = XmlParser<NcSyncManifestXml>.Deserialize(RemoteManifestFile).Files;
var newList = existingFileDetails
.Union(updatedFileDetails)
.OrderByDescending(c => c.LastModifiedDate)
.ToList();
我有两个列表,即List<FileDetails>.
FileDetails是一个类,它有三个东西Name, Md5Hash, LastModified
。这里有两个列表
List<FileDetails> UpdatedList = having 4-5 items of modified files,
and another
List<FileDetails> ExistingList = having 100 files
场景 UpdatedList
中的文件可能存在于ExistingList
中。如果它们存在,它们有不同的
1. MD5Hash and
2. LastModifiedDate
要求(更新)
假设:ExistingList = {[{FileName=xyx.txt,MD5=1,LastModified=12/12/2013}], [{FileName=abc.txt,MD5=11,LastModified=12/13/2013}],[{FileName=def.txt,MD5=111,LastModified=12/14/2013}],
[{FileName=detf.txt,MD5=1111,LastModified=12/14/2013}]}
现在我收到一个更新文件的新列表,其中abc.txt和def.txt有更改,并添加了一个新文件Run.txt
UpdatedList ={[{FileName=abc.txt,MD5=1fsd431,LastModified=12/16/2013}],[{FileName=def.txt,MD5=asdasd34243,LastModified=12/16/2013}]},[{FileName=Run.txt,MD5=sdf45sdf4545asdasd34243,LastModified=12/16/2013}]}
所以合并后的新结果列表将是
NewList ={[{FileName=xyx.txt,MD5=1,LastModified=12/12/2013}], [{FileName=abc.txt,MD5=1fsd431,LastModified=12/16/2013}], // updated abc and def [{FileName=def.txt,MD5=asdasd34243,LastModified=12/16/2013}], //they have different md5 and date in UpdatedList
[{FileName=detf.txt,MD5=1111,LastModified=12/14/2013}]}}]},[{FileName=Run.txt,MD5=sdf45sdf4545asdasd34243,LastModified=12/16/2013}]}
//新增文件
上面的代码合并了数据,但没有更新数据。
您可以使用接受IEqualityComparer
的Union
linq操作符的重载,以便它可以看到两个对象何时(在本例中是语义上的)相同。由于我们总是更喜欢这里更新的文件详细信息,我们可以将其放置在操作符的左侧,以确保它们优先于现有的文件详细信息。
var newList = updatedFileDetails
.Union(existingFileDetails, new FileParametersComparer())
.OrderByDescending(a => a.LastModifiedDate)
.ToList();
文件参数比较器看起来像这样-这里我使用Name
属性来检查它是否引用相同的文件,尽管您可以做任何您需要的。
public class FileParametersComparer : IEqualityComparer<FileDetails>
{
public bool Equals(FileDetails x, FileDetails y)
{
return x.Name.Equals(y.Name, StringComparison.OrdinalIgnoreCase);
}
public int GetHashCode(FileDetails obj)
{
return obj.Name.GetHashCode();
}
}
小提琴:https://dotnetfiddle.net/AtJQvy
您可以通过将列表临时更改为Dictionary来快速而简单地完成:
var tmpDict = ExistingList.ToDictionary(x => x.FileName);
foreach (var item in UpdatedList)
{
tmpDict[item.FileName] = item;
}
var newList = tmpDict.Select(x => x.Value).OrderByDescending(c => c.LastModified).ToList();