using System.Collections.Generic;
public class PetCategoryOwner
public string PetCategory { get; set; }
public string Owner { get; set; }
public class PetCategoriesOwners
public IEnumerable<string> PetCategories { get; set; }
public IEnumerable<string> Owners { get; set; }
public class GroupedOwnerAndPetCategory
public string Owner { get; set; }
public string PetCategory { get; set; }
public int Group { get; set; }
public static void Main()
var petCategoryOwner = new List<PetCategoryOwner>()
new() { Owner = "Higa", PetCategory = "Terry"},
new() { Owner = "Higa", PetCategory = "Charlotte"},
new() { Owner = "Oliver", PetCategory = "Terry"},
new() { Owner = "Oliver", PetCategory = "Charlotte"},
new() { Owner = "Oliver", PetCategory = "Chausie"},
new() { Owner = "Price", PetCategory = "Chausie"},
new() { Owner = "Liam", PetCategory = "Terry"},
new() { Owner = "Liam", PetCategory = "Chartreux"}
var petCategoriesOwners = new List<PetCategoriesOwners>()
new PetCategoriesOwners()
PetCategories = new List<string>() { "Terry", "Charlotte" },
Owners = new List<string>() { "Oliver", "Higa" }
new PetCategoriesOwners()
PetCategories = new List<string>() { "Chausie" },
Owners = new List<string>() { "Oliver", "Price" }
new PetCategoriesOwners()
PetCategories = new List<string>() { "Chartreux", "Terry" },
Owners = new List<string>() { "Liam" }
var grouped = petCategoriesOwners
.SelectMany((ownerPetMix, index) => petCategoryOwner
ownerPetMix.Owners.Contains(ownerPetPair.Owner) &&
ownerPetMix.PetCategories.Contains(ownerPetPair.PetCategory))
.Select(ownerPetPair => new GroupedOwnerAndPetCategory
Owner = ownerPetPair.Owner,
PetCategory = ownerPetPair.PetCategory,
foreach (var entry in grouped)
Console.WriteLine($"{entry.Owner.PadRight(6)}\t{entry.PetCategory.PadRight(9)}\t{entry.Group}");