Получение перекрывающихся строк из двух списков разных классов - PullRequest
0 голосов
/ 15 мая 2019

Скажем, у меня есть два разных класса:

class Animal
{
    string Name {get; set;}
    int Age {get; set;}
    string Description {get; set;}
}

class ButcheringMemo
{
    string ButcherShopName {get; set;}
    DateTime ButcheringTime {get; set;}
    string AnimalName {get; set;}
}

Если бы у меня был список Animal и список ButcheringMemo, какой был бы лучший способ создания списка продуктов Animal, где Name изAnimal выглядит как AnimalName в ButcheringMemo?

Мой неаккуратный способ заключается в следующем:


List<Animal> animalsToButcher = new List<Animal>();
List<ButcheringMemo> butcheringMemos = getAllButcheringMemos();
List<string> animalNamesInButchering = new List<string>();

foreach (ButcheringMemo memo in butcheringMemos)
{
   animalNamesInButchering.Add(memo.AnimalName);
}

List<Animal> animals = getAllAnimals();

foreach (Animal animal in animals)
{
   bool isIn = false;
   foreach (string name in animalNamesInButchering)
   {
      if (animal.Name == name)
         isIn = true;
   }

   if (!isIn)
   {
      animalsToButcher.Add(animal);
   }
}

return animalsToButcher;

Мне кажется, что должен быть лучший способ, чем иметь цикл for внутри цикла for.

Ответы [ 3 ]

2 голосов
/ 15 мая 2019

Вы, по сути, хотите получить всех таких животных, чье имя присутствует в списке ButcheringMemo.Вы можете использовать Linq Join(), как показано ниже (System.Linq пространство имен)

var data = butcheringMemos.Join(animals,
                                x => x.AnimalName,
                                y => y.Name,
                                (x, y) => new { Animal = x}).ToList();
2 голосов
/ 15 мая 2019

Используя LINQ, вы можете объединить все это в одно утверждение:

animalsToButcher = animals.Where(a => butcheringMemos.Select(m => m.AnimalName).Contains(a.Name)).ToList();

Это вернет объект List<Animal>, содержащий животных, которым Name соответствует AnimalName из списка записок о разделке. Тогда вам не понадобится ваш List<string> animalNamesInButchering, потому что он найден в утверждении.

0 голосов
/ 15 мая 2019

Вы также можете использовать немного другой синтаксис Linq, который делает сравнение имени животного без учета регистра:

private static List<Animal> GetAnimalsToButcher()
{
    List<ButcheringMemo> butcheringMemos = getAllButcheringMemos();

    return getAllAnimals()
        .Where(animal => butcheringMemos.Any(memo =>
            memo.AnimalName.Equals(animal.Name, StringComparison.OrdinalIgnoreCase)))
        .ToList();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...