Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:投影-以与列表相同的方式访问对象集合中的给定字符串属性<;字符串>;_C#_Linq_Collections_Projection - Fatal编程技术网

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

C#:投影-以与列表相同的方式访问对象集合中的给定字符串属性<;字符串>;,c#,linq,collections,projection,C#,Linq,Collections,Projection,一个简短的问题。我在测试方法中有一个对象集合(unchangeditems),并希望确保它们与我的“预期”元素匹配。如图所示,您可以按元素执行,但这并不理想。我确信可以使用投影沿着下面的底线深入到字符串变量(LMAA_代码-不要问大写字母!)。我很乐意帮忙 谢谢 // Works but not very elegant Assert.AreEqual(result.unchangedItems[0].LMAA_CODE,expectedunchangedItems[0]

一个简短的问题。我在测试方法中有一个对象集合(unchangeditems),并希望确保它们与我的“预期”元素匹配。如图所示,您可以按元素执行,但这并不理想。我确信可以使用投影沿着下面的底线深入到字符串变量(LMAA_代码-不要问大写字母!)。我很乐意帮忙

谢谢

// 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));
那么:

for (int i = 0; i < result.unchangedItems.Count; i++) {
    Assert.AreEqual(result.unchangedItems[i].LMAA_CODE, expectedUnchangedItems[i]);
}

.Any()
如果过滤后的序列包含元素,则返回true,但不应返回。这就是为什么调用
IsFalse
。如果您的测试框架(或您正在使用的任何框架)没有该功能,您可以始终执行
Assert.AreEqual(\uuuuuuuuuuuuuuuuuuuuuuuu,false)
您可以使用LINQ和
Zip

Assert.IsTrue(result.unchangedItems.Zip(expectedunchangedItems, (actual, expected) => actual.LMAA_CODE == expected).All(value => value));

你已经差不多做到了,只是在LMAA_代码中添加了一个投影:

 Assert.IsTrue(Enumerable.SequenceEqual(result.unchangedItems.Select( x=> x.LMAA_CODE), 
                                        expectedunchangedItems));
您还可以使用“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()方法:


x.Where(…).Any()==>x.Any(…)
Edit:doh.:\@Porges我不认为
Any()
具有接受索引位置的重载
:)
循环的想法是我的第一个冲动,但我知道我是“一个投影”。BrokenGlass的想法正是我想要实现的。谢谢你的评论,伙计@格林科特,不客气。我仍然会使用循环,因此我可以确切地知道它在哪里失败。不要尝试压缩所有内容:)我从未听说过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));
// 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));