C# 使用.Where子句和条件筛选数组
我有两个IEnumerable列表,它们有一个名为GetId的方法,该方法返回一个整数 我想比较两个列表。如果UpdatedBoots.getId返回一个与OldBoots相比唯一的Id,我想将其添加到列表中 所以我这样做了:C# 使用.Where子句和条件筛选数组,c#,filter,where,C#,Filter,Where,我有两个IEnumerable列表,它们有一个名为GetId的方法,该方法返回一个整数 我想比较两个列表。如果UpdatedBoots.getId返回一个与OldBoots相比唯一的Id,我想将其添加到列表中 所以我这样做了: IEnumerable<Boat> newBoats = updatedBoats .Where(c => oldBoats .Any(d => d.GetId() != c.GetId()) .ToList() 旧船和新
IEnumerable<Boat> newBoats = updatedBoats
.Where(c => oldBoats
.Any(d => d.GetId() != c.GetId())
.ToList()
旧船和新船的当前ID为[1,2,3,4,5]。我想测试基本情况,但这没有通过。新手总是返回一个所有ID的列表,而它应该不返回任何ID。我对c和d的排序有错吗 这个怎么样
var newBoats = updatedBoats.Where(u => !oldBoats.Any(o => o.GetId() == u.GetId()));
此代码的作用是什么
IEnumerable<Boat> newBoats = updatedBoats.Where(c=> oldBoats.Any(d =>d.GetId() != c.GetId()).ToList()
尽管如此,请注意我的评论。使用哈希集可以更有效地实现这一点:
这大大减少了嵌套迭代的数量,如果您有很多船,尤其是在更新中有很多新船,您将看到不同
HashSet方法适用于ID,但如果您使用ID在Boat类上实现Equals和GetHashcode进行比较,您也可以使其适用于实体本身。Where不返回bool。你的内部Where可能是Any。@MikeMcCaughan谢谢我更新了问题,但我仍然返回所有整数你的问题没有意义,你说如果newBoats.getId返回唯一的Id,你能正确地解释一下吗?我会尝试使用Select从旧船上获取ID,然后使用更新船上的where来检查ids中没有的内容。请向我们提供GetId的代码,以及运行该代码时更新船上有什么内容。
IEnumerable<Boat> newBoats = updatedBoats.Where(c=> oldBoats.Any(d =>d.GetId() != c.GetId()).ToList()
var newBoats = updatedBoats.Where(u => !oldBoats.Any(o => o.GetId() == u.GetId()));
// This is O(o * n) for # of old boats * # of updates that are new boats, and something like O((o/2)*n) for # of old boats * number of updated old boats
// This is O(n) for # of updated boats
var newBoatIds = new HashSet<Int32>(updatedBoats.Select(b => b.GetId()));
// This is O(n) for # of old boats
newBoatIds.ExceptWith(oldBoats.Select(b => b.GetId()));