Alexander
Alexander

Reputation: 31

Convert loop to linq expression

I have two lists. See my code below:

public class Person
{
    public string Name { get; set; }
    public int ItemOneId { get; set; }
    public int ItemTwoId { get; set; }
}

public class Item
{
    public int ItemOneId { get; set; }
    public int ItemTwoId { get; set; }
}

List<Person> persons = new List<Person>
{
    new Person
    {
        Name = "a",
        ItemOneId = 11,
        ItemTwoId = 23
    },
    new Person
    {
        Name = "c",
        ItemOneId = 11,
        ItemTwoId = 56
    },
    new Person
    {
        Name = "d",
        ItemOneId = 109,
        ItemTwoId = 59
    }
};

List<Item> items = new List<Item>
{
    new Item
    {
        ItemOneId = 11,
        ItemTwoId = 56
    },
    new Item
    {
        ItemOneId = 1,
        ItemTwoId = 2
    }
};

I would like to get all persons from persons list where ItemOneId and ItemTwoId don't exist on items list. I have below code - is better solution?

List<Person> result = new List<Person>();
foreach(Person person in persons)
{
    if (!items.Any(x => x.ItemOneId == person.ItemOneId && x.ItemTwoId == person.ItemTwoId))
    {
        result.Add(person);
    }
}

Or maybe there is no other solution?

Upvotes: 0

Views: 1303

Answers (1)

Simon
Simon

Reputation: 1312

The code below should work!

var result = persons.Where(p => !items.Any(x => x.ItemOneId == p.ItemOneId && x.ItemTwoId == p.ItemTwoId);

Upvotes: 2

Related Questions