rgb
rgb

Reputation: 1850

How to convert nested foreach loops with conditions to LINQ

I'd like to ask if it is possible to convert below nested foreach loops to LINQ expression.

public interface IFoo
{
  bool IsCorrect(IFoo foo);
  void DoSomething(IFoo foo);
}

List<IFoo> listA; //assume that contains items
List<IFoo> listB; //assume that contains items


foreach (var a in listA)
{
  foreach (var b in listB)
  {
    if (b.IsCorrect(a))
    {
      b.DoSomething(a);
    }
  }
}

Upvotes: 3

Views: 3277

Answers (4)

Tim Schmelter
Tim Schmelter

Reputation: 460018

With method syntax you would use this query:

var correctPairs = listA
    .SelectMany(a => listB.Where(b => b.IsCorrect(a)).Select(b => new { a, b }));

foreach (var x in correctPairs)
    x.b.DoSomething(x.a);

Upvotes: 2

Matthew Watson
Matthew Watson

Reputation: 109537

This should work:

var result =
    from a in listA
    from b in listB
    where b.IsCorrect(a)
    select new {a, b};

foreach (var item in result)
    item.b.DoSomething(item.a);

Upvotes: 4

ocuenca
ocuenca

Reputation: 39326

You can do this but this is not more efficient what you have so far:

var query= listA.SelectMany(a=>listB.Select(b=>new {a,b}))
                .Where(e=>e.b.IsCorrect(e.a))
                .ToList()// Foreach is a method of List<T>
                .Foreach(e=> e.b.DoSomething(e.a));

To avoid to call ToList, you can implement an extension method like this:

public static void ForEach<T>(this System.Collection.Generic.IEnumerable<T> list, System.Action<T> action)
{
    foreach (T item in list)
        action(item);
}

And then your query would be:

var query= listA.SelectMany(a=>listB.Select(b=>new {a,b}))
                .Where(e=>e.b.IsCorrect(e.a))
                .Foreach(e=> e.b.DoSomething(e.a));

Upvotes: 1

LordWilmore
LordWilmore

Reputation: 2912

I'm not sure exactly how far you want to go with this, but this is a Linq statement doing the same thing:

listA.ForEach(a => listB.ForEach(b =>
{
    if (b.IsCorrect(a)) b.DoSomething(a);
}));

Upvotes: 1

Related Questions