C #: проекция - доступ к заданному строковому свойству в коллекции объектов таким же образом, как список <string> - PullRequest
2 голосов
/ 10 мая 2011

быстрый вопрос проекции.У меня есть набор объектов (неизмененных элементов) в тестовом методе, и я хотел бы убедиться, что они соответствуют моим «ожидаемым» элементам.Как показано, вы можете сделать это по элементам, но это не идеально.Я уверен, что можно использовать проекцию, чтобы перейти к строковой переменной (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));

Ответы [ 4 ]

4 голосов
/ 10 мая 2011

Вы уже были почти там, просто добавили проекцию в LMAA_CODE:

 Assert.IsTrue(Enumerable.SequenceEqual(result.unchangedItems.Select( x=> x.LMAA_CODE), 
                                        expectedunchangedItems));
1 голос
/ 10 мая 2011

Вы можете использовать LINQ и Zip:

Assert.IsTrue(result.unchangedItems.Zip(expectedunchangedItems, (actual, expected) => actual.LMAA_CODE == expected).All(value => value));
1 голос
/ 10 мая 2011

А как же:

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

0 голосов
/ 10 мая 2011

Вы также можете использовать метод расширения "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));
...