Проверьте, содержит ли один IEnumerable все элементы другого IEnumerable

Что состоит в том, чтобы определить самый быстрый путь, содержит ли один 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
96
задан Brandon Zacharie 25 November 2013 в 02:05
поделиться

3 ответа

Не существует "быстрого способа" сделать это, если вы не отслеживаете и не поддерживаете какое-то состояние, определяющее, все ли значения в одной коллекции содержатся в другой. Если у вас есть только IEnumerable , с которым можно работать, я бы использовал Intersect .

var allOfList1IsInList2 = list1.Intersect(list2).Count() == list1.Count();

Производительность этого должна быть очень разумной, поскольку Intersect () выполнит перечисление по каждому списку только один раз. Кроме того, второй вызов Count () будет оптимальным, если базовым типом является ICollection , а не просто IEnumerable .

126
ответ дан 24 November 2019 в 05:36
поделиться

C # 3.5+

Использование Enumerable.All , чтобы определить, все ли элементы List2 содержатся в List1:

bool hasAll = list2Uris.All(itm2 => list1Uris.Contains(itm2));

Это также будет работать, если list1 содержит даже больше, чем все элементы list2.

20
ответ дан 24 November 2019 в 05:36
поделиться

оператор Linq SequenceEqual также будет работать (но чувствителен к тому, что элементы перечисления находятся в том же порядке)

return list1Uris.SequenceEqual(list2Uris);
2
ответ дан 24 November 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: