Проверка второго столбца отсортирована по дубликатам первого столбца. - PullRequest
0 голосов
/ 29 января 2020

У меня есть два столбца с одинаковым количеством строк, столбец 1 - FirstName, а столбец 2 - LastName. Я делаю несколько сортировок, сортируя первый столбец по возрастанию, а затем сортируя второй столбец по возрастанию на основе дубликатов первого столбца. Как проверить, что при наличии повторяющихся записей в столбце 1 столбец 2 с одинаковым индексом отсортирован правильно См. Изображение, например входное и выходное изображение

  List<string> firstName = new List<string> { "Steve", "John", "Bob", "Bob", "Bob" };
  List<string> lastName = new List<string>  { "John", "Bryant", "Paul", "David", "Apple" };

1 Ответ

1 голос
/ 29 января 2020

Пожалуйста, не разбивайте одну сущность (Name) на несколько коллекций (firstName, lastName).

Давайте объединяем их обратно в один names с помощью Linq Zip:

using System.Linq;

...

var names = firstName
  .Zip(lastName, (first, last) => new { 
     first,
     last 
   })
  .OrderBy(name => name.first) // by first name ascending
  .ThenBy(name => name.last)   // in case of tie by last name ascending
  .ToArray();

// Let's have a look:
Console.Write(string.Join(Environment.NewLine, names
  .Select(name => $"{name.first} {name.last}")));

// If you insist on splitting names back to 2 lists:

firstName = names
  .Select(name => name.first)
  .ToList(); 

lastName = names
  .Select(name => name.last)
  .ToList(); 

Редактировать: Выполнив правильный заказ (names), мы можем проверить предоставленных заказов:

 // Orders to be tested 
 IEnumerable<string> firstNameUnderTest = ...
 IEnumerable<string> lastNameUnderTest = ...

 var counterExamples = names
   .Zip(firstNameUnderTest, (name, fn) => new {name, fn})
   .Zip(lastNameUnderTest, (item, ln) => new {
      expectedFirst = item.name.first,
      expectedLast  = item.name.last,
      actualFirst   = item.fn,
      actualLast    = ln     
    })
   .Where(item => item.expectedFirst != item.actualFirst ||
                  item.expectedLast != item.actualLast)
   .Select(item => $"Expected: {item.expectedFirst}, {item.expectedLast}; " +
                   $"Actual: {item.actualFirst}, {item.actualLast}")
   .ToArray();

Давайте посмотрим на counterExamples:

 Console.Write(string.Join(Environment.NewLine, counterExamples));   

Вы можете указать counterExamples.Any(), чтобы проверить, есть ли хотя бы один неудачный тест, counterExamples.Count(), чтобы подсчитать неудачные тесты и т.д. c.

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