我有一个包含字符串子对象列表的对象列表,并且这些结构可以在几天之间更改,我期待比较它们以查看是否进行了更改。比较在Linq中对象列表的子列表
public class Recipe
{
public string ID { get; set; }
public string Name { get; set; }
public List<string> Ingredients { get; set; }
}
的ID
字段列表的版本和Ingredients
之间的相同仅仅是一个字符串的名单。
List<Recipe> list1 = GetRecipes("2013-06-20");
List<Recipe> list2 = GetRecipes("2013-06-21");
我试图找到所有Recipe
之间有天成分变化。我已经能够拿出一个LINQ语句来找到新的Recipe
s表示通过这样的
var newRecipes = list1.Where(x => !list2.Any(x1 => x1.ID == x.ID))
.Union(list2.Where(x => !list1.Any(x1 => x1.ID == x.ID)));
但不是列表1是列表2但是,我还没有想出如何只选择Recipe
s,表中列出了Ingredient
之间的变化。
var modifiedRecipes = list1.Where(x => !list2.Any(x1 => x1.ID == x.ID && x1.Ingedients.SequenceEqual(x.Ingedients)))
.Union(list2.Where(x => !list1.Any(x1 => x1.ID == x.ID && x1.Ingedients.SequenceEqual(x.Ingedients))));
如何获取已在字符串子列表中进行更改的对象列表?
如果有更好的选择,这是非常低效的。 –
@newStackExchangeInstance实际上,它比你更有效率,因为你不首先检查ID是否相等,以消除具有不同ID的收件人。你的解决方案会运行更多的'SequenceEquals'(还有多少取决于'ExceptBy'的实现,这是不必要的第三方代码) – ghord
ExceptBy是Jon Skeet的代码。/programmingmeme实际上,我的是O(m + n),因为ExceptBy在内部使用了一个hashset,因此只会检查是否存在hashbucket冲突。你的是O(mn)和更多一点。 –