比较两个 ICollection 而不将其分成子范围?

Compare two ICollection without splitting it into subranges?

我目前处于需要比较两个 ICollection 并验证

的情况

一个) 第二个是否包含与第一个相同的项目,

b) 并且如果有多余的元素,保证它可以是vali 使用验证方法过时。

我目前的做法是

一个布尔值

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

有没有比使用 GetRange() 指定 SequenceEqual 的范围更简洁的方法呢? 然后为列表中的新条目定义另一个范围,说明需要验证的新条目?

感觉有点像处理这个问题的hackish方式?

你的东西还不错!

如果集合很大,您可能会遭受重复迭代的困扰,因此您可以使用如下方法来提供与您描述的相同的验证功能,同时最多只迭代一次集合。如果有无效的项目,甚至不是!

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