views:

98

answers:

1

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?

+7  A: 

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"));
Mark Byers
Ah, I thought I was on the right path. I was doing Predicate<Dictionary<int, List<string>>> but I guess that wouldn't make much sense. Thanks.
Ocelot20