Что состоит в том, чтобы определить самый быстрый путь, содержит ли один IEnumerable все элементы другого IEnumerable при сравнении поля/свойства каждого элемента в обоих наборах?
public class Item
{
public string Value;
public Item(string value)
{
Value = value;
}
}
//example usage
Item[] List1 = {new Item("1"),new Item("a")};
Item[] List2 = {new Item("a"),new Item("b"),new Item("c"),new Item("1")};
bool Contains(IEnumerable<Item> list1, IEnumerable<Item>, list2)
{
var list1Values = list1.Select(item => item.Value);
var list2Values = list2.Select(item => item.Value);
return //are ALL of list1Values in list2Values?
}
Contains(List1,List2) // should return true
Contains(List2,List1) // should return false
Не существует "быстрого способа" сделать это, если вы не отслеживаете и не поддерживаете какое-то состояние, определяющее, все ли значения в одной коллекции содержатся в другой. Если у вас есть только IEnumerable
, с которым можно работать, я бы использовал Intersect
.
var allOfList1IsInList2 = list1.Intersect(list2).Count() == list1.Count();
Производительность этого должна быть очень разумной, поскольку Intersect ()
выполнит перечисление по каждому списку только один раз. Кроме того, второй вызов Count ()
будет оптимальным, если базовым типом является ICollection
, а не просто IEnumerable
.
C # 3.5+
Использование Enumerable.All
, чтобы определить, все ли элементы List2 содержатся в List1:
bool hasAll = list2Uris.All(itm2 => list1Uris.Contains(itm2));
Это также будет работать, если list1 содержит даже больше, чем все элементы list2.
оператор Linq SequenceEqual также будет работать (но чувствителен к тому, что элементы перечисления находятся в том же порядке)
return list1Uris.SequenceEqual(list2Uris);