3

I'm wondering if it's possible to refactor these two methods into one. The only difference is in the Select method; one uses BaselineSetNumber, the other ComparisonSetNumber.

public Set LoadBaselineSet(ObservableCollection<Set> sets)
{
    using (var db = _contextFactory.GetContext())
    {
        var setNumber =
            db.Users.Where(x => x.Login == Environment.UserName)
                    .Select(x => x.BaselineSetNumber).Single(); // !!! HERE
        return sets.Single(x => x.SetNumber == setNumber);
    }
}

public Set LoadComparisonSet(ObservableCollection<Set> sets)
{
    using (var db = _contextFactory.GetContext())
    {
        var setNumber =
            db.Users.Where(x => x.Login == Environment.UserName)
                    .Select(x => x.ComparisonSetNumber).Single(); // !!! HERE
        return sets.Single(x => x.SetNumber == setNumber);
    }
}

I'd like to have a method that I can call like LoadSet(sets, BaselineSetNumber); or LoadSet(sets, ComparisonSetNumber);

pennstatephil
  • 1,593
  • 3
  • 22
  • 43
reggaeguitar
  • 1,795
  • 1
  • 27
  • 48
  • 2
    You can do it like LoadSet(sets, x => x.BaseLineSetNumber) if you extract the predicate from Select as parameter (probably a generic type needs to be used). – Bedford May 16 '14 at 19:59
  • There are only 2 types right now, I might need to add more later though – reggaeguitar May 16 '14 at 19:59

1 Answers1

4

Yes, this is possible by creating a higher-order function. Your new code would look something like this:

public Set LoadBaselineSet(ObservableCollection<Set> sets)
{
    return LoadSet(sets, (x) => x.BaselineSetNumber)
}

public Set LoadComparisonSet(ObservableCollection<Set> sets)
{
    return LoadSet(sets, (x) => x.ComparisonSetNumber)
}

public Set LoadSet(ObservableCollection<Set> sets, Func<dbObject, Int> elementIdentity){
        using (var db = _contextFactory.GetContext())
    {
        var setNumber =
            db.Users.Where(x => x.Login == Environment.UserName)
                    .Select(elementIdentity).Single(); // !!! HERE
        return sets.Single(x => x.SetNumber == setNumber);
    }
}
Chris
  • 2,885
  • 18
  • 25
  • A little tip for refactoring this: if you have Resharper installed then you can select the lambda in the editor and press Ctrl+R, Ctrl+P (Introduce Parameter) to make it a little more convenient. – Bedford May 16 '14 at 20:07
  • Thanks for the response. In the Func parameter declaration I had to change it to Func then it worked great. – reggaeguitar May 19 '14 at 15:13