比较两个 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));
我目前处于需要比较两个 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));