我有一個包含字符串子對象列表的對象列表,並且這些結構可以在幾天之間更改,我期待比較它們以查看是否進行了更改。比較在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)和更多一點。 –