8

This is a general question, but here is the specific case I'm looking for a solution to:

I have a Dictionary<int, List<string>> I want to apply various predicates to. I want one method that can take care of multiple LINQ queries such as these:

from x in Dictionary
where x.Value.Contains("Test")
select x.Key

from x in Dictionary
where x.Value.Contains("Test2")
select x.Key

So I'm looking for a method like so:

public int GetResult(**WhatGoesHere** filter)
{
    return from x in Dictionary.Where(filter)
           select x.Key;
}

To be used like so:

int result;

result = GetResult(x => x.Value.Contains("Test"));
result = GetResult(x => x.Value.Contains("Test2"));

What is the proper syntax for WhatGoesHere?

Ocelot20
  • 10,510
  • 11
  • 55
  • 96

1 Answers1

15

You can use Func<KeyValuePair<int, List<string>>, bool>:

public int GetResult(Func<KeyValuePair<int, List<string>>, bool> filter)
{
    return (from x in Dictionary
            where filter(x)
            select x.Key).FirstOrDefault();
}

Or alternatively: Predicate<KeyValuePair<int, List<string>>>. I think Func which was introduced in .NET 3.5 is preferred these days.

You are using x to mean two different things in your final example and this will give a compile error. Try changing one of the xs to something else:

x = GetResult(y => y.Value.Contains("Test1"));
Community
  • 1
  • 1
Mark Byers
  • 811,555
  • 193
  • 1,581
  • 1,452
  • Ah, I thought I was on the right path. I was doing Predicate>> but I guess that wouldn't make much sense. Thanks. – Ocelot20 Aug 03 '10 at 19:13