Как проверить, заказан ли список?

Я знаю, что это собирается казаться старомодным, но я не думаю, что большая часть использовании учебных руководств онлайн учит языки программирования или платформы. Они обычно дают Вам не больше, чем немного вкуса языка. Для реального изучения языка Вам нужен эквивалент "книги", и во многих случаях, это означает реальную мертво-древовидную книгу.

, Если Вы хотите изучить C, считайте K& R. Если Вы хотите изучить C++, считайте Stroustrup. Если Вы хотите изучить Lisp/схему, считайте SICP. И т.д.

, Если Вы не готовы потратить больше чем 30$ и несколько часов для изучения языка, Вы, вероятно, не собираетесь изучать его.

55
задан AGB 19 May 2016 в 20:54
поделиться

8 ответов

Если вы используете MSTest, вы можете взглянуть на CollectionAssert.AreEqual .

Enumerable.SequenceEqual может быть еще одним полезным API для использования в утверждении.

В обоих случаях вы должны подготовить список, содержащий ожидаемый список в ожидаемом порядке, а затем сравнить этот список с результатом.

Вот пример:

var studyFeeds = Feeds.GetStudyFeeds(2120, DateTime.Today.AddDays(-200), 20);   
var expectedList = studyFeeds.OrderByDescending(x => x.Date);
Assert.IsTrue(expectedList.SequenceEqual(studyFeeds));
60
ответ дан 26 November 2019 в 17:37
поделиться

Что-то LINQ-y могло бы использовать отдельный отсортированный запрос ...

var sorted = from item in items
 orderby item.Priority
 select item;

Assert.IsTrue(items.SequenceEquals(sorted));

Выведение типа означает, что вам понадобится

 where T : IHasPriority

Однако, если у вас есть несколько элементов с одинаковым приоритетом , то для утверждения модульного теста вам, вероятно, лучше всего просто выполнить цикл с индексом списка, как предложил Джейсон.

1
ответ дан 26 November 2019 в 17:37
поделиться

Как насчет:

var list = items.ToList();
for(int i = 1; i < list.Count; i++) {
    Assert.IsTrue(yourComparer.Compare(list[i - 1], list[i]) <= 0);
} 

где yourComparer - это экземпляр YourComparer , который реализует IComparer . Это гарантирует, что каждый элемент меньше, чем следующий элемент в перечислении.

7
ответ дан 26 November 2019 в 17:37
поделиться
var studyFeeds = Feeds.GetStudyFeeds(2120, DateTime.Today.AddDays(-200), 20);
var orderedFeeds = studyFeeds.OrderBy(f => f.Date);

for (int i = 0; i < studyFeeds.Count; i++)
{
    Assert.AreEqual(orderedFeeds[i].Date, studyFeeds[i].Date);
}
0
ответ дан 26 November 2019 в 17:37
поделиться

Так или иначе, вам придется пройтись по списку и убедиться, что элементы находятся в том порядке, в котором вы хочу. Поскольку сравнение элементов является настраиваемым, вы можете подумать о создании для этого универсального метода и передаче функции сравнения - точно так же, как при сортировке списка используются функции сравнения.

1
ответ дан 26 November 2019 в 17:37
поделиться
if(studyFeeds.Length < 2)
  return;

for(int i = 1; i < studyFeeds.Length;i++)  
 Assert.IsTrue(studyFeeds[i-1].Date > studyFeeds[i].Date);

для еще не умер!

9
ответ дан 26 November 2019 в 17:37
поделиться

Если в вашей среде модульного тестирования есть вспомогательные методы для подтверждения равенства коллекций, вы должны иметь возможность сделать что-то вроде этого (со вкусом NUnit):

var sorted = studyFeeds.OrderBy(s => s.Date);
CollectionAssert.AreEqual(sorted.ToList(), studyFeeds.ToList());

Метод assert работает с любыми IEnumerable , но когда обе коллекции имеют тип IList или «массив чего-то», сообщение об ошибке, выдаваемое при сбое утверждения, будет содержать индекс первого неподходящего элемента.

26
ответ дан 26 November 2019 в 17:37
поделиться

В .NET 4.0 можно было бы использовать метод Enumerable.Zip , чтобы заархивировать список со смещением на единицу, который объединяет каждый элемент с последующим элементом в список. Затем вы можете проверить, выполняется ли условие для каждой пары, например

var ordered = studyFeeds.Zip(studyFeeds.Skip(1), (a, b) => new { a, b })
                        .All(p => p.a.Date < p.b.Date);

. Если вы используете более раннюю версию фреймворка, вы можете без особых проблем написать свой собственный метод Zip, что-то вроде следующего (проверка аргументов и удаление счетчики, если применимо, оставлены читателю):

public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(
    this IEnumerable<TFirst> first,
    IEnumerable<TSecond> second,
    Func<TFirst, TSecond, TResult> selector)
{
    var e1 = first.GetEnumerator();
    var e2 = second.GetEnumerator();
    while (e1.MoveNext() & e2.MoveNext()) // one & is important
        yield return selector(e1.Current, e2.Current);
}
37
ответ дан 26 November 2019 в 17:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: