Сравните два ICollection, не разбивая их на поддиапазоны?

В настоящее время я нахожусь в ситуации, когда мне нужно сравнить два ICollection и проверить

а) содержит ли второй те же элементы, что и первый,

b) и если есть дополнительный элемент, убедитесь, что его можно проверить с помощью метода проверки.

То, как я сейчас это делаю,

логическое значение, как это

bool hasBaseSequence = x.SequenceEqual(y.ToList().GetRange(0, x.Count),Comparer)

Есть ли более аккуратный способ сделать это вместо того, чтобы использовать GetRange(), чтобы указать диапазон, в котором SequenceEqual, а затем определить другой диапазон для новой записи в списке, указав новую запись, которая должна быть проверена?

Это немного похоже на хакерский способ справиться с этим?


person kafka    schedule 24.02.2020    source источник
comment
Дополнительный элемент где именно? В любой коллекции?   -  person Austin T French    schedule 24.02.2020
comment
@AustinTFrench позволяет сказать, что y содержит 3 элемента, а x содержит только 2 элемента. Я хотел бы проверить, одинаковы ли первые два элемента для x и Y, а затем проверить новую запись о доходе.   -  person kafka    schedule 24.02.2020
comment
И коллекции тоже объекты, верно? Не просто наборы строк?   -  person Austin T French    schedule 24.02.2020
comment
Да @AustinTFrench   -  person kafka    schedule 24.02.2020


Ответы (1)


То, что у вас есть, не так уж и плохо!

Если коллекции большие, вы можете пострадать от повторяющихся итераций, поэтому вы можете использовать метод, подобный следующему, чтобы обеспечить ту же функциональность проверки, которую вы описали, при этом повторяя коллекции не более одного раза. Даже если есть недействительный элемент!

public static bool ValidateWithBaseSequence<T>(
    IEnumerable<T> baseSequence,
    IEnumerable<T> newSequence,
    IEqualityComparer<T> equalityComparer,
    Func<T, bool> newItemValidator)
{
    using var baseEnumerator = baseSequence.GetEnumerator();
    using var newEnumerator = newSequence.GetEnumerator();

    while (baseEnumerator.MoveNext())
    {
        if (newEnumerator.MoveNext())
        {
            if (!equalityComparer.Equals(
                    baseEnumerator.Current, 
                    newEnumerator.Current))
            {
                return false;
            }
        }
        else
        {
            throw new InvalidOperationException(
                "New sequence is shorter than base sequence.");
        }
    }

    while (newEnumerator.MoveNext())
    {
        if (!newItemValidator(newEnumerator.Current))
        {
            return false;
        }
    }

    return true;
}

Применение:

var isValid = ValidateWithBaseSequence(x, y, Comparer, item => vaidationFunction(item));
person Oliver    schedule 24.02.2020