一个快速投影问题。 我在测试方法中有一个对象集合(未更改项),并希望确保它们与我的"预期"元素匹配。 如图所示,您可以按元素执行此操作,但这并不理想。 我确信可以使用投影来沿着下面的底线向下处理字符串变量(LMAA_CODE - 不要问大写字母! 我很感激能帮忙。
谢谢!
// Works but not very elegant
Assert.AreEqual(result.unchangedItems[0].LMAA_CODE,expectedunchangedItems[0]);
Assert.AreEqual(result.unchangedItems[1].LMAA_CODE,expectedunchangedItems[1]);
Assert.AreEqual(result.unchangedItems[2].LMAA_CODE,expectedunchangedItems[2]);
Assert.AreEqual(result.unchangedItems[3].LMAA_CODE,expectedunchangedItems[3]);
// ?Can something like this be done? eg result.unchangedItems => result.unchangedItems.LMAA_CODE
Assert.IsTrue(Enumerable.SequenceEqual(result.unchangedItems.LMAA_CODE, expectedunchangedItems));
你已经快到了,只是在LMAA_CODE中添加了一个投影:
Assert.IsTrue(Enumerable.SequenceEqual(result.unchangedItems.Select( x=> x.LMAA_CODE),
expectedunchangedItems));
LINQ 和 Zip
:
Assert.IsTrue(result.unchangedItems.Zip(expectedunchangedItems, (actual, expected) => actual.LMAA_CODE == expected).All(value => value));
怎么样:
for (int i = 0; i < result.unchangedItems.Count; i++) {
Assert.AreEqual(result.unchangedItems[i].LMAA_CODE, expectedUnchangedItems[i]);
}
您还可以执行以下操作:
Assert.IsFalse(result.unchangedItems.Where((r,i) => expectedUnchangedItems[i] != r.LMAA_CODE).Any())
如果过滤后的序列包含元素,.Any()
将返回 true,而不应返回。这就是为什么你打电话给IsFalse
.如果您的测试框架(或您使用的任何框架)没有该框架,您可以随时执行Assert.AreEqual(____, false)
。
您也可以使用"Zip"扩展方法。
Assert.AreEqual(result.unchangedItems.Count, expectedunchangedItems.Count);
result.unchangedItems.Zip(expectedunchangedItems, (a, b) => Tuple.Create(a, b))
.ForEach(p => Assert.AreEqual(p.Item1.LMAA_CODE, p.Item2));
这样,异常将报告哪个值不是预期的。Zip() 方法包含在 .NET 4 中,但我个人更喜欢使用我自己的方法,当然你也需要一个 ForEach():
// I actually have a Pair<A,B> struct that I prefer to use, but
// KeyValuePair or Tuple works almost as well.
public static IEnumerable<Tuple<A, B>> ZipTuples<A, B>(this IEnumerable<A> a, IEnumerable<B> b)
{
IEnumerator<A> ea = a.GetEnumerator();
IEnumerator<B> eb = b.GetEnumerator();
while (ea.MoveNext() && eb.MoveNext())
yield return new Tuple<A, B>(ea.Current, eb.Current);
}
public static void ForEach<T>(this IEnumerable<T> list, Action<T> action)
{
foreach (T item in list)
action(item);
}
用法:
Assert.AreEqual(result.unchangedItems.Count, expectedunchangedItems.Count);
result.unchangedItems.ZipTuples(expectedunchangedItems)
.ForEach(p => Assert.AreEqual(p.Item1.LMAA_CODE, p.Item2));