C#:投影 - 以与列表<string>相同的方式访问对象集合中的给定字符串属性



一个快速投影问题。 我在测试方法中有一个对象集合(未更改项),并希望确保它们与我的"预期"元素匹配。 如图所示,您可以按元素执行此操作,但这并不理想。 我确信可以使用投影来沿着下面的底线向下处理字符串变量(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));

相关内容

  • 没有找到相关文章

最新更新