比较两个集合的数据
本文关键字:集合 数据 两个 比较 | 更新日期: 2023-09-27 17:59:15
我有两个可观察的集合1.TruckItems
2.TruckItemsComparison
。两者完全相同。
我将数据从EF6加载到第一个TruckItems
集合,然后10秒后将数据加载到第二个集合TruckItemsComparison
。现在,添加到我的第二个集合中的新数据可能最近从另一个来源更新了,我只需要添加第一个集合中还不存在的最新数据。
我想检查我的第二个收藏中是否有任何id与我的第一个收藏中的任何id不匹配,然后只添加不匹配的项目。
代码:
这是我加载数据的地方:
private async void LoadTrucks()
{
using (TruckServiceClient service = new TruckServiceClient())
{
var items = await service.GetTrucksAsync();
if (TruckItems.Count == 0)
{
foreach (var item in items)
{
TruckItems.Add(new TruckItems
{
TruckId = item.TruckId,
TruckQuoteId = item.QuoteId,
TruckPhaseId = item.CurrentPhaseId,
TruckChassisManufacturer = item.ChassisManufacturer,
TruckChassisModel = item.ChassisModel,
TruckStatus = item.Status,
TruckJobNumber = item.JobNumbers,
TruckAddedBy = item.AddedBy,
TruckClientName = item.ClientName,
TruckClientSurname = item.ClientSurname,
TruckClientDetail = item.ClientDetail,
TruckCurrentPhase = item.CurrentPhase
});
}
}
foreach (var item in items)
{
TruckItemsComparison.Add(new TruckItems
{
TruckId = item.TruckId,
TruckQuoteId = item.QuoteId,
TruckPhaseId = item.CurrentPhaseId,
TruckChassisManufacturer = item.ChassisManufacturer,
TruckChassisModel = item.ChassisModel,
TruckStatus = item.Status,
TruckJobNumber = item.JobNumbers,
TruckAddedBy = item.AddedBy,
TruckClientName = item.ClientName,
TruckClientSurname = item.ClientSurname,
TruckClientDetail = item.ClientDetail,
TruckCurrentPhase = item.CurrentPhase
});
}
}
}
这里是我想比较我的两个收藏:
public void UpdateTrucks()
{
LoadTrucks();
if (TruckItems.Count != 0)
{
var truckItemsId = TruckItems.Where(x => x.TruckId != 0).First().TruckId;
foreach (var item in TruckItemsComparison.Where(x => x.TruckId != truckItemsId))
{
TruckItems.Add(item);
}
}
}
我的问题是,它将来自两个集合的数据添加在一起,而不管id是否对应。很明显,我在这里的逻辑不起作用,所以有人能告诉我如何比较数据,并只插入我的TruckItems
集合中还不存在的id吗。谢谢,如果您需要任何更多信息,请告诉我。
您可以使用Except
:枚举TruckItemsComparison
中的每个项目
public void UpdateTrucks()
{
LoadTrucks();
if (TruckItems.Count != 0)
{
foreach (var item in TruckItemsComparison.Except(TruckItems))
{
TruckItems.Add(item);
}
}
}
如果你只想比较你的TruckItems
的Id,那么你就可以实现你自己的IEqualityComparer
:
internal class TruckItemsComparer : IEqualityComparer<TruckItems>
{
#region IEqualityComparer Members
public bool Equals(TruckItems x, TruckItems y)
{
return (((x == null) && (y == null)) ||
((x != null) && (y != null) && x.TruckId == y.TruckId));
}
public int GetHashCode(TruckItems obj)
{
return obj. TruckId.GetHashCode();
}
#endregion
}
然后像这样使用:
foreach (var item in TruckItemsComparison.Except(TruckItems, new TruckItemsComparer()))