Сравнить две ICollection, не разбивая их на поддиапазоны? - PullRequest
1 голос
/ 24 февраля 2020

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

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 24 февраля 2020

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

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

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));
...